linux - Perl 加密 STDIN 密码

标签 linux perl security unix encryption

我正在制作一个 Perl 模块,它为第 3 方 API 提供 OO 接口(interface)。我想在将用户密码传输到第 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');

最佳答案

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

我认为您无法阻止具有足够访问权限的人窥视您的系统调用或内存。

关于linux - Perl 加密 STDIN 密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17153809/

相关文章:

c - 显示目录中的文件

regex - 如何在 zgrep/zcat 命令中指定正则表达式?

mysql - 来自 mysql 数据的 Perl 输出矩阵。跨 2 个轴的输出,每个轴都有计数

database - 为什么我不应该让外人访问我的数据库?

asp.net - web.config 是否比数据库更安全?

无法在 RedHat 中运行程序

regex - 搜索多个连续字符并替换为单个字符,同时排除某些字符

Unix 命令的 Perl 用户输入

.net - PublicKeyToken 和公钥有什么区别?

linux - bash 脚本中的 set -e 是什么意思?