我正在编写一个Perl模块,为第三方API提供面向对象的接口。在将用户密码传输到第三方API之前,我希望以加密格式捕获和存储用户密码。该模块仅用于基于UNIX的系统。
我已经编写了以下脚本来执行捕获功能 - 这样做是否正确,只存储密码变量的加密格式?我担心密码可能在其他地方的内存中可用(例如,在undef下的$_中)。
注:我使用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');
/r
代表什么? - mpapec/r
是 Perl 5.14 中引入的非破坏性替换(参见 perlop)- 它不会直接修改字符串,而是返回一个修改后的副本(非常方便的功能)。 - Grzegorz Rożniecki