通常,要上传加密文件,我首先对整个文件进行加密,然后再上传加密的文件。但是,对于大型文件,这并不容易,因为我需要一个外部硬盘驱动器来保存加密的文件。我想知道是否有可能加密一个大文件,比如500 GB大小的文件,一点一点地加密,然后将加密的信息一点一点地发送到一个上传流中,比如Google?谢谢。
发布于 2019-11-08 00:27:41
是。您的主要问题是,您需要一个允许从流接收文件的客户端,而不是单个文件。
例如,如果您通过ssh复制文件,通常会执行以下操作
scp myfile.txt远程主机:
但是,这期望前面的文件存在。但这恰好相当于:
cat myfile.txt _ ssh远程主机'cat > myfile.txt‘
它是一种表单,您现在可以轻松地插入加密筛选器。
cat myfile.txt \ gpg -e -r AA00BB00CC00DD _ ssh远程主机'cat > myfile.txt.gpg‘
另一种选择是使用一个虚拟文件系统,它将文件显示为加密,但在访问时执行加密。这将使加密层对执行上载的程序透明。
这方面的一个例子是使用成群的熔断器文件系统实用程序。手册页本身展示了一个示例,说明如何将其与--reverse
标志一起使用,以便创建用于复制文件的加密视图。
最后,不需要双磁盘空间的最后一种方法是通过明文加密文件。也就是说,使用一个程序对文件的前10³进行加密,并用加密的程序替换原始文件的前10³。然后是第二块10 so,以此类推。
然而,如果进程中途失败(例如由于停电),您将得到一个半加密文件,这是有风险的。如果要使文件解密,则需要在上传后执行第二次内联解密。只有当您希望将本地文件加密,但您没有空间以不同的方式处理它时,我才会推荐它。但它还是解决了你的问题,
我认为最常见的cli命令是scp
、sftp
和rsync
,它们都提出了相同的问题。
对于普通文件,不考虑元数据
或任何其他任意的块体大小
更新: OP注释询问是否可以将文件分成不同的部分,分别加密和上传。这显然是可能的。您只需要依次提取文件的片段,加密和上传它们。
下面的脚本就是这样做的:
#!/bin/bash
FILENAME=file.dat # File to encrypt, set to "$1" if using as a command
KEY=user321627 # Identifier of the PGP key to use
BLOCKSIZE=$((10 * 1024 * 1024)) # Use 10 MB chunks
FILESIZE=$(stat -c %s "$FILENAME")
BLOCKS=$(( ($FILESIZE - 1 ) / $BLOCKSIZE + 1))
for i in $(seq 1 $BLOCKS); do
echo Encrypting part $i of $BLOCKS
dd if="$FILENAME" bs=$BLOCKSIZE skip=$(($i - 1)) count=1 | gpg -e -r $KEY > "$FILENAME.$i.gpg"
sha256sum "$FILENAME.$i.gpg" >> hashes.txt
echo Uploading part $i
upload-file "$FILENAME.$i.gpg"
rm "$FILENAME.$i.gpg"
done
根据需要调整。我假设将gpg加密到OpenPGP密钥(通常是一个很好的选择),并且有一个命令upload-file
将作为参数传递的文件发送到最终目的地,例如Google。
考虑到除了机密性之外,您可能还需要完整性,所以我将在hashes.txt
上存储每个加密部分的散列,以便您以后可以验证每个部分。
https://security.stackexchange.com/questions/220854
复制相似问题