J'écris actuellement mon propre petit gestionnaire de mots de passe
C'est votre première erreur. Quelque chose de ce complexe comporte de nombreux pièges subtils dans lesquels même les experts tombent parfois, sans beaucoup d'expérience dans ce domaine, vous n'avez aucune chance de faire quelque chose de même proche de la sécurité.
stocke la clé dans un SHA256 hash
Oh oh ...
Cela n'indique pas nécessairement que vous faites quelque chose de mal, mais j'ai de sérieux doutes que vous allez le faire correctement. Je suppose que vous parlez d'un mot de passe principal haché ici? Le mot de passe principal doit être transformé en une clé à l'aide d'un KDF comme PBKDF2, bcrypt ou Argon2, alors cette clé est utilisée pour crypter les mots de passe stockés.
Si vous voulez avoir un moyen de vérifier que le mot de passe est correct, stocker un hachage de la clé devrait convenir, mais vous NE DEVEZ PAS stocker la clé elle-même ... si vous stockez la clé toute personne ayant accès à votre stockage a tout ce dont ils ont besoin pour déchiffrer tous les mots de passe!
Si vous ne parlez pas de hachage d'un mot de passe principal et que vous parlez d'une clé réellement générée aléatoirement, je n'ai aucune idée de ce que vous essayez d'accomplir ici , mais vous ne devriez pas utiliser un KDF lent avec un grand nombre d'itérations.
Sinon, vous pouvez hacher le mot de passe principal deux fois, une fois pour le stocker sous forme de hachage pour vérifier plus tard que le mot de passe saisi par l'utilisateur est correct, et encore une fois à utiliser comme clé pour le cryptage. Selon la façon dont cela est fait, cela peut aller d'un défaut de conception à la divulgation complète de la clé.
Modifier: Après avoir vu le code complet, cela semble être une quatrième option: vous stockez un hachage du mot de passe pour vérifiez plus tard si le mot de passe entré est correct, puis vous hachez ce hachage pour l'utiliser comme clé, ce qui est presque aussi mauvais que de simplement stocker la clé elle-même.
I créez le hachage en procédant comme suit:
def sha256_rounds (raw, rounds = 100001): obj = hashlib.sha256 () for _ in xrange (rounds):
obj.update (raw) raw = obj.digest () return obj.digest ()
Ce n'est pas vraiment clair ce que raw
est ici, mais je suppose que c'est le mot de passe. Ce que vous faites est un hachage non salé utilisant SHA256. N'essayez pas de créer votre propre KDF!
Après sa création, il est stocké avec ce qui suit:
key = base64.urlsafe_b64encode (provided_key) length = len (key) avec open (key_file, "a +") as key_: front_salt, back_salt = os.urandom (16), os.urandom (16) key_.write ("{} {} {}: {}". format (front_salt, key, back_salt, length))
Donc, vous créez la clé en hachant le mot de passe, puis en ajoutant un sel à l'avant et à l'arrière? Non seulement la concaténation de 2 sels différents à l'avant et à l'arrière n'est pas standard, mais cela n'accomplit rien ici car c'est fait après que le KDF a déjà terminé! Vous ajoutez simplement des valeurs aléatoires pour les avoir là-bas.
Pour montrer à quel point c'est mauvais (à partir du commit 609fdb5ce976c7e5aa1832670505da60012b73bc), il suffit de vider tous les mots de passe stockés em> sans exiger aucun mot de passe principal est la suivante:
de encryption.aes_encryption import AESCipherfrom lib.settings import store_key, MAIN_DIR, DATABASE_FILE, display_formatted_list_outputfrom sql.sql import create_connection, select_all_dataconn, curseur = create_connection (DATABASE_FILE) display_formatted_list_output (select_all_data (curseur, "encrypted_data"), store_key (MAIN_DIR))
Même si cela peut être une bonne expérience d'apprentissage d'essayer de créer un gestionnaire de mots de passe, s'il vous plaît please Contents ne l'utilisez jamais pour quelque chose d'important à distance. Comme le suggère @Xenos, il ne semble pas que vous ayez suffisamment d'expérience pour que la création de votre propre gestionnaire de mots de passe soit vraiment bénéfique de toute façon, ce serait probablement une meilleure opportunité d'apprentissage de jeter un œil à un gestionnaire de mots de passe open source existant.