Produkuję moduł Perla, który zapewnia interfejs OO dla interfejsu API innej firmy. Chcę przechwycić i przechowywać hasło użytkownika w zaszyfrowanym formacie, zanim zostanie przesłane do interfejsu API innej firmy. Moduł jest przeznaczony do uruchamiania tylko w systemach UNIX.Haseł STDIN szyfrujących w języku Perl
Utworzono następujący skrypt, który wykonuje funkcję przechwytywania - czy jest to poprawne w tym sensie, że przechowuje tylko zmienną hasła w zaszyfrowanym formacie? Obawiam się, że hasło może być dostępne w pamięci w innym miejscu (np. Pod $ _ chociaż $ _ jest undef).
NB. Używam STDIN zamiast @ARGV z założeniem, że system operacyjny nie zarejestruje wpisu lub nie poda hasła w nazwie procesu. Używam zastępczego regex zamiast chomp, aby wejście nie musiało być przechowywane w tymczasowej niezaszyfrowanej zmiennej. Zakładam również, że nie można być całkowicie bezpiecznym w tym sensie, że oprogramowanie do przechwytywania wejścia może nadal przechwytywać dane wejściowe użytkownika.
góry dzięki
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');
powinieneś prawdopodobnie sprawdzić długość hasła, a co oznacza '/ r'? –
@mpapec '/ r' to niedestrukcyjne podstawienie wprowadzone w perlu 5.14 (patrz perlop) - nie modyfikuje łańcucha w miejscu, ale zamiast tego zwraca zmodyfikowaną kopię (bardzo przydatna funkcja). – Xaerxess
Kogo próbujesz chronić? Jeśli ktoś może zajrzeć do pamięci procesu, aby odczytać zaszyfrowane hasło, należy założyć, że może również odczytać klucz i źródło twojego programu. Odczytywanie hasła ze stdin, a nie jako argumentu wiersza poleceń, chroni przed zwykłymi przeglądarkami i jest prawdopodobnie najlepszym, czego można się spodziewać. –