【发布时间】:2013-06-13 18:40:34
【问题描述】:
我正在制作一个为第 3 方 API 提供 OO 接口的 Perl 模块。我想在将用户密码传输到第 3 方 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) - 它不会修改字符串,而是返回修改后的副本(非常方便的功能)。 -
你想保护谁?如果有人可以偷看您的进程内存以读取加密密码,则您必须假设他们也可以读取密钥和您的程序源。从标准输入读取密码而不是作为命令行参数读取密码可以防止普通浏览器,这可能是您可以期待的最好的。
标签: linux perl security unix encryption