Tôi đang tạo mô-đun Perl cung cấp giao diện OO cho API của bên thứ ba. Tôi muốn nắm bắt và lưu trữ mật khẩu của người dùng ở định dạng được mã hóa trước khi được truyền tới API của bên thứ ba. Module này chỉ được chạy trên các hệ thống dựa trên UNIX.Perl mã hóa mật khẩu STDIN
Tôi đã tạo tập lệnh sau thực hiện chức năng chụp - điều này có đúng theo nghĩa là nó chỉ lưu trữ biến mật khẩu ở định dạng được mã hóa không? Tôi lo ngại rằng mật khẩu có thể có sẵn trong bộ nhớ ở nơi khác (ví dụ: dưới $ _ mặc dù $ _ là undef).
NB. Tôi đang sử dụng STDIN thay vì @ARGV với giả định rằng hệ điều hành sẽ không đăng nhập mục nhập hoặc bao gồm mật khẩu trong tên quy trình. Tôi đang sử dụng một regex thay thế chứ không phải là chomp để đầu vào sẽ không phải được lưu trữ trong một biến không mã hóa tạm thời. Tôi cũng giả định rằng không thể hoàn toàn an toàn theo nghĩa là phần mềm chụp đầu vào vẫn có thể nắm bắt được đầu vào của người dùng.
Cảm ơn trước
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');
bạn có thể nên kiểm tra độ dài mật khẩu và '/ r' là viết tắt của cái gì? –
@mpapec '/ r' là thay thế không phá hủy được giới thiệu trong perl 5.14 (xem perlop) - nó không sửa đổi chuỗi tại chỗ nhưng trả về một bản sao sửa đổi thay vào đó (tính năng rất tiện dụng). – Xaerxess
Bạn đang cố gắng bảo vệ điều này từ đâu? Nếu ai đó có thể nhìn vào bộ nhớ quá trình của bạn để đọc mật khẩu được mã hóa, bạn phải giả định rằng họ cũng có thể đọc khóa và nguồn chương trình của bạn. Đọc mật khẩu từ stdin thay vì như một đối số dòng lệnh sẽ bảo vệ khỏi các trình duyệt thông thường, và có lẽ là tốt nhất bạn có thể mong đợi. –