Effacement sécurisé du mot de passe en mémoire (Python)

Comment stocker un mot de passe entré par l'utilisateur en mémoire et l'effacer en toute sécurité lorsqu'il n'est plus nécessaire?

pour élaborer, nous avons actuellement le code suivant:

username = raw_input('User name: ')
password = getpass.getpass()
mail = imaplib.IMAP4(MAIL_HOST)
mail.login(username, password)

après avoir appelé la méthode login , que devons-nous faire pour remplir la zone de mémoire qui contient le mot de passe avec des caractères déformés afin que quelqu'un ne puisse pas récupérer le mot de passe en faisant un dump du noyau?

Il ya un similaire question, cependant il est en Java et la solution utilise des tableaux de caractères: comment stocke-t-on les hachures de mot de passe en toute sécurité en mémoire, lors de la création de comptes?

peut-on le faire en Python?

37
demandé sur Community 2009-04-08 05:13:20

7 réponses

Python n'a pas ce faible d'un niveau de contrôle sur la mémoire. L'accepter, et d'avancer. Le best que vous pouvez faire est de del password après avoir appelé mail.login de sorte qu'il ne reste aucune référence à l'objet password string. Toute solution qui prétend pouvoir faire plus que cela ne vous donne qu'un faux sentiment de sécurité.

les objets Python string sont immuables; il n'y a aucun moyen direct de changer le contenu d'une chaîne après qu'elle soit créé. même si vous étiez capable de réécrire d'une manière ou d'une autre le contenu de la chaîne de caractères mentionnée par password (ce qui est techniquement possible avec des trucs de ctypes stupides), il y aurait encore d'autres copies du mot de passe qui ont été créées dans diverses opérations de chaîne de caractères:

  • par le module getpass lorsqu'il supprime la nouvelle ligne de départ du mot de passe saisi
  • par le module imaplib lorsqu'il mot de passe, puis crée la commande complète IMAP avant de la transmettre à la socket

il faudrait d'une façon ou d'une autre obtenir des références à toutes ces chaînes et écraser leur mémoire ainsi.

41
répondu Miles 2009-04-08 02:01:43

il y a effectivement-est-un moyen d'Effacer les chaînes en toute sécurité en Python; utilisez la fonction memset C, comme dans marquez les données comme sensibles en python

18
répondu amcgregor 2017-05-23 12:09:06

si vous n'avez pas besoin de l'objet mail pour persister une fois que vous en avez terminé avec lui, je pense que votre meilleur pari est d'effectuer le travail de mailing dans un sous-processus (voir le module sous-processus ). Ainsi, lorsque le sous-processus meurt, votre mot de passe disparaît.

7
répondu zdan 2009-04-08 02:26:42

cela pourrait être fait en utilisant numpy chararray:

import numpy as np

username = raw_input('User name: ')
mail = imaplib.IMAP4(MAIL_HOST)
x = np.chararray((20,))
x[:] = list("{:<20}".format(raw_input('Password: ')))
mail.login(username, x.tobytes().strip())
x[:] = ''

, Vous devez déterminer la taille maximale du mot de passe, mais cela doit supprimer les données lorsqu'il est écrasé.

2
répondu heplat 2015-07-23 14:47:47

la solution correcte est d'utiliser un bytearray() ... qui est mutable, et vous pouvez en toute sécurité Effacer les clés et le matériel sensible de la mémoire vive.

cependant, il y a certaines bibliothèques, notamment la bibliothèque "cryptographie" en python qui empêche "bytearray" d'être utilisé. C'est problématique... dans une certaine mesure, ces bibliothèques cryptographiques devraient s'assurer que les types seulement mutables soient utilisés pour le matériel clé.

Il ya Sécuritéstring qui est un pip module qui vous permet de supprimer une clé de mémoire...(Je l'ai légèrement remanié et l'ai appelé SecureBytes). J'ai écrit quelques tests unitaires qui démontrent que la clé est retirée complètement.

mais il y a une grosse mise en garde: si le mot de passe de quelqu'un est" type", alors le mot" type " sera effacé de tout python... y compris dans les définitions de fonction et les attributs d'objet.

En d'autres termes... muter des types immuables est une idée terrible, et sauf si vous êtes extrêmement prudent, peut immédiatement planter n'importe quel programme courant.

la bonne solution... n'utilisez jamais les types immuables pour le matériel clé, les mots de passe, etc. Quiconque construit une bibliothèque cryptographique ou une routine comme "getpass" devrait travailler avec un "bytearray" au lieu de chaînes python.

0
répondu Erik Aronesty 2018-08-20 18:52:04

stocke le mot de passe dans une liste, et si vous définissez la liste à null, la mémoire du tableau stocké dans la liste est automatiquement libérée.

-2
répondu AlbertoPL 2009-04-08 01:20:09

EDIT: supprimé les mauvais conseils...

vous pouvez également utiliser des tableaux comme l'exemple java si vous le souhaitez, mais juste l'écriture devrait suffire.

http://docs.python.org/library/array.html

-2
répondu Trey Stout 2009-04-08 07:30:07