Je produit un module PERL qui fournit une interface OO pour une API tierce. Je souhaite 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é sur des systèmes basés sur UNIX uniquement.
J'ai produit le script suivant qui effectue la fonction de capture - est-ce correct en ce sens qu'il stocke uniquement la variable de mot de passe dans un format crypté? Je suis préoccupé par le fait que le mot de passe peut être disponible en mémoire ailleurs (par exemple moins de $ _ bien que $ _ adef). P>
NB. J'utilise STDIN plutôt que @Argv avec l'hypothèse que le système d'exploitation ne consomme pas l'entrée ou n'inclut pas le mot de passe dans le nom de processus. J'utilise une regex substitut plutôt que de chomber pour que l'entrée ne soit pas à stockée dans une variable temporaire non cryptée. Je suppose également qu'il n'est pas possible d'être complètement sécurisé en ce sens que le logiciel de capture d'entrée pourrait toujours capturer l'entrée de l'utilisateur. P>
Merci d'avance p>
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');
3 Réponses :
$ strace perl -E '<STDIN>' .... scroll, scroll, scroll .... read(0, ... type, type, type .... "secret\n", 4096) = 7 exit_group(0) = ? I don't think that you can prevent someone with sufficient access rights from peeking inside your system calls or memory.
C'est dur. P>
Exécutez votre code cryptage en tant que processus distinct, enfant du code principal, quel processus se lit à partir de STDIN et renvoie le mot de passe crypté (et peut-être la clé). De cette manière, le code utilisant votre module ne tiendra jamais le texte clair en mémoire. P>
Sûr, contrôle et inspection de la mémoire (et System em> inspection de la mémoire après la mort de processus) de l'aide de l'aide de l'enfant révélera le plaintext. Les mêmes techniques révéleront également la clé et le chiffrement d'un enfant. Toutefois, si le scénario contre lequel vous souhaitez défendre est une conservation accidentelle du texte en danger dans votre processus - dans un objet complexe ou une fermeture ou une fermeture ou je-savais-la-connaissez-la-var-var-var-alloua-là-là - alors Faites le travail dans un processus dédié et de courte durée. p>
On dirait que vous implémentez le Mot de passe Anti-motif . C'est une idée terrible - il enseigne aux utilisateurs d'être phis. S'il vous plaît ne faites pas ça. Vous devriez regarder en utilisant OAuth à la place. P>
S'il vous plaît éclairer moi comment je peux utiliser OAuth sur les applications de ligne de commande? Surtout si l'API que l'emballage de l'OP attend d'un mot de passe crypté i>?
C'est certainement possible (j'ai des programmes de ligne de commande de ligne de commande qui utilisent OAuth), mais la mise en place d'OAuth peut initialement être un peu complexe et aura besoin d'un navigateur. Voir Github.com/Davorg/LocalTwits/blob/master/build.pluce a> pour un exemple. Mais même s'il était impossible, ce n'est pas une excuse pour encourager les utilisateurs à briser la première règle de sécurité Internet - ne partagez jamais un mot de passe avec une tierce partie.
Merci - Utiliser cette approche supprimerait beaucoup de risques de sécurité. Je me rends compte que cela n'était pas dans mon message, mais je dois générer un modèle XML envoyé via HTTPS à l'API tierce. Si l'API tiers ne prend pas en charge l'oautho explicitement, puis-je toujours l'utiliser pour résoudre ce problème?
Vous ne pouvez utiliser que OAuth avec des services prenant en charge OAuth. Mais vous ne devriez jamais demander à un utilisateur de vous donner leur mot de passe pour un autre service.
Suite à ce dictum Ce module n'a pas pu être écrit car tous les services API nécessitent une session authentifiée.
@SILLYMOOSE: Cela semble probable. Mais qu'est-ce qui est plus important pour vous? Écrire ce service ou les utilisateurs d'enseignement que la sécurité du mot de passe Internet est sans importance? Vous trouverez peut-être mon article de blog sur le sujet intéressant - Blog .Dave.org.uk / 2012/03 / Internet-Sécurité-règle-one.html
Vous devriez probablement vérifier la longueur du mot de passe et que signifie
/ r code>?
@mpapec
/ r code> est une substitution non destructive introduite dans Perl 5.14 (voir Perlop) - Il ne modifie pas la chaîne en place mais renvoie une copie modifiée à la place (caractéristique très pratique).
Avec qui essayez-vous de protéger cela? 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'ils peuvent également lire la clé et la source de votre programme. Lire le mot de passe de STDIN plutôt que sous forme d'argument de ligne de commande protégera des navigateurs occasionnels et est probablement le meilleur que vous puissiez attendre.