Perl加密STDIN密码

Dav*_*ell 11 unix linux security encryption perl

我正在制作一个Perl模块,为第三方API提供OO接口.我希望在将用户密码传输到第三方API之前以加密格式捕获并存储用户密码.该模块仅用于在基于UNIX的系统上运行.

我已经生成了以下执行捕获功能的脚本 - 这是正确的,因为它只以加密格式存储密码变量?我担心密码可能在其他地方的内存中可用(例如在$ _下虽然$ _是undef).

NB.假设操作系统不会记录条目或在进程名称中包含密码,我使用的是STDIN而不是@ARGV.我正在使用替代正则表达式而不是chomp,因此输入不必存储在临时的非加密变量中.我还假设输入捕获软件仍然可以捕获用户的输入,这是不可能完全安全的.

提前致谢

use strict;
use warnings;
use Crypt::CBC;
use 5.14.0;

print 'Please enter your password: ';
system('tty -echo');
my $key = Crypt::CBC->random_bytes(56);
my $iv  = Crypt::CBC->random_bytes(8);
my $cipher = Crypt::CBC->new(-key    => $key,
                             -cipher => 'Blowfish',
                             -salt   => 1,
                             );
my $ciphertext = $cipher->encrypt(<STDIN> =~ s/\n$//r);
system('tty echo');
Run Code Online (Sandbox Code Playgroud)

inn*_*naM 9

$ strace perl -E '<STDIN>'
.... scroll, scroll, scroll ....
read(0, 
... type, type, type ....
"secret\n", 4096)               = 7
exit_group(0)                           = ?
Run Code Online (Sandbox Code Playgroud)

我不认为您可以阻止具有足够访问权限的人窥视您的系统调用或内存.


pil*_*row 6

这很难.

将加密代码作为单独的进程运行,即主代码的子进程,该进程从STDIN读取并返回加密的密码(也许是密钥).这样,使用您的模块的代码本身永远不会在内存中保留明文.

当然,儿童助手的追踪和记忆检查(以及过程死亡后的系统记忆检查)将显示明文.相同的技术也将揭示从儿童助手读取的密钥和密文.但是,如果你想要防御的场景是在你的进程中意外保留明文 - 在一个复杂的对象或一个闭包中,或者我 - 不知道 - 临时变量 - 被分配 - 那么 - 那么在专门的,短暂的过程中完成工作.