使用 openssl 和 tar 加密磁带文件

使用 openssl 和 tar 加密磁带文件

我正在尝试通过 openssl 管道传输输出,为当前的磁带备份脚本添加加密,目前我有:

tar -czpvf /dev/nst0 /home /otherdir

因此添加 openssl 会出现以下结果:

tar czpvf - /home /otherdir | openssl aes-256-cbc -e -salt -pass file:/my_passwd > /dev/nst0

这不会给出任何错误,但是我在网上找到的唯一解密方法是:

dd if=/dev/nst0 conv=sync | openssl aes-256-cbc -d -salt -pass file:/my_passwd | tar xzpvf -

这给出了正确的文件列表,但我得到:

bad decrypt 8340:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:461:

每次。

我该如何修复此问题?

答案1

我认为这可能与使用分组密码有关。

当我这样做时我会得到类似的错误:

$ tar czpvf - /test/directory |openssl aes-256-cbc -e -salt -pass pass:password | dd of=/tmp/foo.encrypted.tgz
$ dd if=/tmp/foo.encrypted.tgz conv=sync | openssl aes-256-cbc -d -salt -pass pass:password |tar xzpvf -

但是当我使用像 rc4 这样的流密码时,例如:

$ tar czpvf - /test/directory |openssl rc4 -e -salt -pass pass:fred | dd of=/tmp/foo.encrypted.tgz

我没有收到那个错误。

答案2

大多数情况下,我看到 OpenSSL 的这种错误消息是由于密码错误。您可以暂时尝试在解密行中替换为,看看file:/my_passwd是否pass:yourpassword成功?当然,这不是一个好的永久解决方案,但可以尝试使用它进行调试。

答案3

您需要填充分组密码的输入。尝试使用块大小 4k 和 conv=sync 选项将您的 tar 传输到 dd。这将填充数据的末尾。

答案4

最好使用mbuffer写入磁带,因为它可以处理磁带跨越和缓冲(减少擦鞋),并且它会以完整的块写入以保证磁带驱动器正常运行。请参阅这个答案对于示例脚本, mbuffer从中读取stdin压缩和加密对它来说不是问题,即使跨越多个磁带(有些事情tar无法做到)。

至于需要使用ddsync这是因为磁带驱动器需要以块为单位写入。请参阅这个答案详细说明原因,但简短的回答是再次使用mbuffer固定大小的块(例如每个 256kB)写入数据可以解决问题。

相关内容