Posteriormente a mirar en diferentes repositorios y páginas webs de internet finalmente nos encontramos con la solución que te enseñaremos más adelante.
Solución:
mkpasswd
es un front-end para el crypt()
función. No creo que sea un hash SHA512 directo aquí.
Un poco de investigación apunta a la especificación de SHA256-crypt y SHA512-crypt, que muestra que el hash se aplica 5000 veces por defecto. Puede especificar un número diferente de rondas usando el -R
cambiar a mkpasswd
; -R 5000
de hecho te da el mismo resultado:
$ mkpasswd -m sha-512 -S salt1234 -R 5000 password
$6$rounds=5000$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81
El número mínimo de rondas que ofrece la herramienta de línea de comandos es 1000:
$ mkpasswd -m sha-512 -S salt1234 -R 999 password
$6$rounds=1000$salt1234$SVDFHbJXYrzjGi2fA1k3ws01/D9q0ZTAh1KfRF5.ehgjVBqfHUaKqfynXefJ4DxIWxkMAITYq9mmcBl938YQ//
$ mkpasswd -m sha-512 -S salt1234 -R 1 password
$6$rounds=1000$salt1234$SVDFHbJXYrzjGi2fA1k3ws01/D9q0ZTAh1KfRF5.ehgjVBqfHUaKqfynXefJ4DxIWxkMAITYq9mmcBl938YQ//
El algoritmo es un poco más complicado y requiere que cree varios resúmenes. Tú pudo en su lugar acceda a la C crypt()
función a través de la crypt.crypt()
y condúzcalo de la misma manera que el mkpasswd
la línea de comandos lo hace.
Depende de su plataforma si el SHA512-crypt
el método está disponible; la versión Python 3 del crypt
módulo ofrece un crypt.methods
lista que le indica qué métodos admite su plataforma. Dado que esto usa exactamente la misma biblioteca mkpasswd
usos, su sistema operativo obviamente admite SHA512-crypt
y Python también tendrá acceso.
Necesitas prefix la sal con '$6$
para especificar el método diferente. Puede especificar el número de rondas agregando un 'rounds=
string Entre los '$6$'
string y tu sal:
import crypt
import os
import string
try: # 3.6 or above
from secrets import choice as randchoice
except ImportError:
from random import SystemRandom
randchoice = SystemRandom().choice
def sha512_crypt(password, salt=None, rounds=None):
if salt is None:
salt = ''.join([randchoice(string.ascii_letters + string.digits)
for _ in range(8)])
prefix = '$6$'
if rounds is not None:
rounds = max(1000, min(999999999, rounds or 5000))
prefix += 'rounds=0$'.format(rounds)
return crypt.crypt(password, prefix + salt)
Esto entonces produce la misma salida que el mkpasswd
línea de comando:
>>> sha512_crypt('password', 'salt1234')
'$6$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81'
>>> sha512_crypt('password', 'salt1234', rounds=1000)
'$6$rounds=1000$salt1234$SVDFHbJXYrzjGi2fA1k3ws01/D9q0ZTAh1KfRF5.ehgjVBqfHUaKqfynXefJ4DxIWxkMAITYq9mmcBl938YQ//'
necesitas usar crypt.crypt
:
>>> import crypt
>>> crypt.crypt('password', '$6$' + 'salt1234')
'$6$salt1234$Zr07alHmuONZlfKILiGKKULQZaBG6Qmf5smHCNH35KnciTapZ7dItwaCv5SKZ1xH9ydG59SCgkdtsTqVWGhk81'
Si te ha sido de utilidad nuestro post, sería de mucha ayuda si lo compartes con el resto entusiastas de la programación y nos ayudes a difundir este contenido.