example encrypt decrypt python salt sha hashlib saltedhash

encrypt - Hashing en SHA512 usando una sal?-Python



python md5 (6)

He estado revisando la documentación de hashlib, pero no he encontrado nada que indique el uso de la sal cuando se procesan los datos.

La ayuda sería genial.


SHA512 no es una gran manera de almacenar contraseñas hash en estos días. Deberías estar usando bcrypt o algo similar. Lo importante es que la salazón está incorporada y que el algoritmo tiene un factor de trabajo significativo.

Si saltea sus contraseñas SHA512 simplemente agregando (o anteponiendo) la sal al texto plano, cualquiera que tenga en sus manos un conjunto de contraseñas hash y aplique una herramienta moderna ( http://arstechnica.com/security/2013/05/how-crackers-make-minced-meat-out-of-your-passwords/ ) podrá ver la contraseña concatenada + valores de sal y probablemente, mediante una coincidencia trivial de patrones, podrá separar la porción de contraseña de la porción de sal para la mayoría si no todas las cuentas en cuestión.

No he pensado en esto todo el tiempo, y de ninguna manera soy un experto en seguridad, pero me parece que si fuera a encriptar (usando, por ejemplo, AES256) la contraseña usando la sal como clave, y luego, compruebe que con SHA512, estaría a salvo de la vulnerabilidad que describí anteriormente.

Sin embargo, en ese momento has puesto más esfuerzo de lo que hubiera tomado cambiar a bcrypt y todavía no tendrías la protección de un factor de trabajo, por lo que solo recomendaría un enfoque como ese si el entorno en el que te encuentras trabajar en no ofrece esa opción.


Salar no es un proceso mágico que la biblioteca necesita para ayudarlo; solo se trata de datos adicionales proporcionados para evitar que funcionen las tablas rainbow.

>>> 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 está buscando un reemplazo para crypt (), las versiones más nuevas de glibc tienen "$ 6 $" basado en SHA-512 con un recuento de iteraciones variable (consulte la página de Ulrich Drepper , que tiene una descripción y enlaces a una implementación C completa de sha512_crypt_r() ).

Escribir tu propia cripto es altamente desaconsejable: el sha512(salt+password) anterior sha512(salt+password) no ayuda contra un ataque de fuerza bruta.

Para generar sal, use algo como os.urandom(16) para bytes aleatorios o ''''.join(map(lambda x:''./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz''[ord(x)%64], os.urandom(16))) para caracteres arbitrarios al azar de base64 (para usar con crypt () - alikes).

(Digo base64-por igual no es lo mismo que Base64 en PEM / MIME.)


Simplemente agregue la sal a sus datos confidenciales:

>>> 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''


usa passlib, escribir tu propia contraseña crypto es una manera casi segura de fallar.


La respuesta de Samir es correcta, pero algo críptica. Básicamente, la sal es solo un poco de datos derivados aleatoriamente que prefijas o fijas tus datos para aumentar drásticamente la complejidad de un ataque de diccionario en tu valor hash. Entonces, dados s datos y la sal, harías lo siguiente para generar un hash salado de los datos:

import hashlib hashlib.sha512( s + d ).hexdigest()

Vea este artículo de Wikipedia para más detalles