J'ai parcouru la documentation de hashlib mais je n'ai rien trouvé sur l'utilisation de sel quand hachage données.
L'aide serait formidable.
La réponse de Samir est correcte mais quelque peu cryptique. Fondamentalement, le sel n'est qu'un bit de données dérivé au hasard avec lequel vous préfixez ou postfixez vos données pour augmenter considérablement la complexité d'une attaque par dictionnaire sur votre valeur de hachage. Donc, étant donné un sel s
et des données d
, vous devez simplement faire ce qui suit pour générer un hachage salé des données:
import hashlib
hashlib.sha512( s + d ).hexdigest()
Voir ceci article wikipedia pour plus de détails
Ajoutez simplement le sel à vos données sensibles:
>>> import hashlib
>>> m = hashlib.sha512()
>>> m.update('salt')
>>> m.update('sensitive data')
>>> m.hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
>>> n = hashlib.sha512()
>>> n.update('%ssensitive data' % 'salt')
>>> n.hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
>>> hashlib.sha512('salt' + 'sensitive data').hexdigest()
'70197a4d3a5cd29b62d4239007b1c5c3c0009d42d190308fd855fc459b107f40a03bd427cb6d87de18911f21ae9fdfc24dadb0163741559719669c7668d7d587'
Le salage n'est pas un processus magique dont la bibliothèque a besoin pour vous aider - ce sont juste des données supplémentaires fournies pour empêcher les tables Rainbow de fonctionner.
>>> import hashlib
>>> m = hashlib.sha512()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\xd0\xf4\xc1LH\xadH7\x90^\xa7R\x0c\xc4\xafp\x0fd3\xce\t\x85\xe6\xbb\x87\xb6\xb4a|\xb9D\xab\xf8\x14\xbdS\x96M\xdb\xf5[A\xe5\x81+:\xfe\x90\x89\x0c\nM\xb7\\\xb0Cg\xe19\xfdb\xea\xb2\xe1'
>>> m.update(b"My super-secret salt.")
>>> m.digest()
b'\xcd\xd7K\xd9!~\xa8\x1d6\x9b\xa6\xde\x06\t\x02\xa1+}\xaeNA\x94a`\xaa\xf4\xe9\xb5\xff\x1f\x9cE\x84m\xbb\x98U\xb4z\x92\x9e\xe8\xc9\xc2\xc8\x8f\x068e\xb0\r\xed\xb7\xde\x80\xa6,\n\x111w{\xa2\x9b'
Si vous cherchez un remplacement pour crypt (), les nouvelles versions de glibc ont "$ 6 $" basé sur SHA-512 avec un nombre d'itérations variable (voir page d'Ulrich Drepper , qui a une description et liens vers une implémentation C complète de sha512_crypt_r()
).
Écrire votre propre crypto est fortement déconseillé - la sha512(salt+password)
ci-dessus n'aide pas contre une attaque par force brute.
Pour générer du sel, utilisez quelque chose comme os.urandom(16)
pour les octets aléatoires ou ''.join(map(lambda x:'./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'[ord(x)%64], os.urandom(16)))
pour les caractères aléatoires de base64 (pour une utilisation avec crypt () - alikes).
(Je dis que la base64 n'est pas la même que la Base64 dans PEM/MIME.)
utilisez passlib, écrire votre propre mot de passe crypto est un moyen presque sûr d'échouer.
SHA512 n'est pas un excellent moyen de stocker des mots de passe hachés de nos jours. Vous devez utiliser bcrypt ou quelque chose de similaire. L'important est que le salage soit intégré et que l'algorithme ait un facteur de travail important.
Si vous salez vos mots de passe SHA512 en ajoutant simplement (ou en ajoutant) le sel au texte en clair, toute personne qui met la main sur un ensemble de vos mots de passe hachés et applique un outil de craquage moderne ( http://arstechnica.com/ security/2013/05/how-crackers-make-haché-viande-hors-de-vos-mots de passe / ) sera en mesure de voir le mot de passe concaténé + les valeurs de sel et sera probablement, grâce à une correspondance de modèle triviale, pour séparer la partie mot de passe de la partie sel pour la plupart sinon la totalité des comptes en question.
Je n'ai pas réfléchi à tout cela et je ne suis en aucun cas un expert en sécurité, mais il me semble que si vous deviez crypter (en utilisant, par exemple, AES256) le mot de passe en utilisant le sel comme clé, et puis hachez que avec SHA512, vous seriez à l'abri de la vulnérabilité que j'ai décrite ci-dessus.
Cependant, à ce stade, vous avez déployé plus d'efforts qu'il n'aurait fallu pour passer à bcrypt et vous n'auriez toujours pas la protection d'un facteur de travail, donc je ne recommanderais une approche comme celle-ci que si l'environnement que vous utilisez travailler dans ne propose pas cette option.