Я создаю модуль Perl, который предоставляет интерфейс OO для стороннего API. Я хочу захватить и сохранить пароль пользователя в зашифрованном формате, прежде чем он будет передан стороннему API. Модуль предназначен только для UNIX-систем.Perl шифрование паролей STDIN
Я создал следующий скрипт, который выполняет функцию захвата - это правильно в том смысле, что он хранит только переменную пароля в зашифрованном формате? Я обеспокоен тем, что пароль может быть доступен в памяти в другом месте (например, в $ _ хотя $ _ - 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');
Вы должны, вероятно, проверить длину пароля и что означает '/ r'? –
@mpapec '/ r' - неразрушающая подстановка, введенная в perl 5.14 (см. Perlop) - она не изменяет строку на месте, но вместо этого возвращает измененную копию (очень удобная функция). – Xaerxess
Кто вы пытаетесь защитить это? Если кто-то может заглянуть в память процесса, чтобы прочитать зашифрованный пароль, вы должны предположить, что они также могут прочитать ключ и источник вашей программы. Чтение пароля из stdin, а не как аргумент командной строки, будет защищать от случайных браузеров и, вероятно, лучшее, что вы можете ожидать. –