Je produis un module Perl qui fournit une interface OO pour une API tierce. Je veux capturer et stocker le mot de passe de l'utilisateur dans un format crypté avant qu'il ne soit transmis à l'API tierce. Le module est destiné à être exécuté uniquement sur des systèmes basés sur UNIX.Perl chiffrage des mots de passe STDIN
J'ai créé le script suivant qui exécute la fonction de capture - est-ce correct dans le sens où il stocke uniquement la variable de mot de passe dans un format crypté? Je suis inquiet que le mot de passe puisse être disponible en mémoire ailleurs (par exemple sous $ _ bien que $ _ soit undef).
NB. J'utilise STDIN plutôt que @ARGV avec l'hypothèse que le système d'exploitation ne consignera pas l'entrée ou n'inclura pas le mot de passe dans le nom du processus. J'utilise une regex de remplacement plutôt que chomp afin que l'entrée ne soit pas stockée dans une variable temporaire non chiffrée. Je suppose également qu'il n'est pas possible d'être complètement sécurisé dans le sens où le logiciel de capture d'entrée pourrait toujours capturer l'entrée de l'utilisateur.
Merci à l'avance
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');
vous devriez probablement vérifier la longueur du mot de passe, et que signifie '/ r'? –
@mpapec '/ r' est une substitution non destructive introduite dans perl 5.14 (voir perlop) - elle ne modifie pas la chaîne en place mais renvoie une copie modifiée à la place (fonction très pratique). – Xaerxess
De qui es-tu en train de protéger? Si quelqu'un peut jeter un coup d'œil à votre mémoire de processus pour lire le mot de passe crypté, vous devez supposer qu'il peut également lire la clé et la source de votre programme. Lire le mot de passe de stdin plutôt que comme un argument de ligne de commande protégera des navigateurs occasionnels, et est probablement le meilleur que vous pouvez vous attendre. –