海量文件加密不适用于 openssl

海量文件加密不适用于 openssl

我有一堆日志文件,我试图使用 openssl 用公钥/私钥对其进行加密并保存到我的 NAS,但失败了。

我的日志文件位于以下路径:

/var/SYSLOGS/hosts/archive

我的公钥和私钥在/etc/log-enc/

[root@NAG01 log-enc]# ls -l
total 8
-rw-r--r-- 1 root root 891 Jul 11 15:58 syslog_privalye_key.pem
-rw-r--r-- 1 root root 272 Jul 11 15:59 syslog_public_key.pem

现在我正在尝试执行以下命令如果我一一执行相同的命令,那么就没有问题。

for file in `find /var/SYSLOGS/hosts/archive/`
do  
FILE_BASE=$(basename $file)
echo "$file=>/NFS/Nag01/syslogs/hosts/$FILE_BASE.enc"
openssl rsautl -encrypt -inkey  /etc/log-enc/syslog_public_key.pem -pubin -in $file -out /NFS/Nag01/syslogs/hosts/$FILE_BASE.enc
done

这是错误日志

RSA operation error
140628568049480:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:151:
/var/SYSLOGS/hosts/archive/192.168.33.5.log-20160131.gz=>/NFS/Nag01/syslogs/hosts/192.168.33.5.log-20160131.gz.enc
RSA operation error
140123978278728:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:151:
/var/SYSLOGS/hosts/archive/app02.log-20160306.gz=>/NFS/Nag01/syslogs/hosts/app02.log-20160306.gz.enc
/var/SYSLOGS/hosts/archive/192.168.34.8.log-20160227.gz=>/NFS/Nag01/syslogs/hosts/192.168.34.8.log-20160227.gz.enc
RSA operation error
139777258493768:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:151:
/var/SYSLOGS/hosts/archive/192.168.31.3.log-20160511.gz=>/NFS/Nag01/syslogs/hosts/192.168.31.3.log-20160511.gz.enc

这是原始文件。

[root@NAG01 log-enc]# ls -l /var/SYSLOGS/hosts/archive/192.168.33.5.log-20160131.gz
-rw-------. 1 root root 3569 Jan 31 04:16 /var/SYSLOGS/hosts/archive/192.168.33.5.log-20160131.gz
[root@NAG01 log-enc]# ls -l /var/SYSLOGS/hosts/archive/192.168.34.8.log-20160227.gz
-rw-------. 1 root root 2142 Feb 27 03:11 /var/SYSLOGS/hosts/archive/192.168.34.8.log-20160227.gz

答案1

这对我有用。

首先创建密钥

openssl req -x509 -nodes -newkey rsa:2048 -keyout private-key.pem -out public-key.pem

然后同样的循环

for file in `find /var/SYSLOGS/hosts/archive/`
do 
FILE_BASE=$(basename $file)
echo "$file=>/NFS/Nag01/syslogs/hosts/$FILE_BASE.enc"
openssl smime -encrypt -binary -aes-256-cbc -in  $file -out /NFS/Nag01/syslogs/hosts/$FILE_BASE.enc -outform DER public-key.pem

done

答案2

不要用于openssl加密文件。它不是为此而设计的。 (openssl其实不是设计的)你只是在黑暗中摸索。老虎笼子里。

GnuPG专为加密文件而设计。从您的发行版安装它。用于gpg --gen-key生成新密钥。密钥存储在~/.gnupg.用于gpg --export从帐户导出公钥、gpg --export-secret-keys导出密钥以及gpg --import将其导入到另一个帐户。

要加密文件,请使用gpg -e /path/to/file.要解密,请使用gpg /path/to/file.gpg.


不解析输出find, 使用find … -exec …。并且始终在变量和命令替换周围使用双引号。也许您的文件现在没有特殊字符,但使用双引号不会造成任何损害,并且有一天会让您免于安全漏洞。

您的脚本还会以其他方式被破坏,例如尝试加密目录,从而导致虚假错误。从脚本的外观来看,您似乎不希望在 中找到子目录/var/SYSLOGS/hosts/archive/,在这种情况下您不需要find.

cd /var/SYSLOGS/hosts/archive/ &&
for x in *; do
  gpg -e -o "/NFS/Nag01/syslogs/hosts/$x.gpg" "$x"
done

如果有子目录:

cd /var/SYSLOGS/hosts/archive/ &&
find . -type f -exec sh -c '
  mkdir -p "${0%/*}" &&
  gpg -e -o "/NFS/Nag01/syslogs/hosts/$0.gpg" "$0"
'

相关内容