Saltar al contenido

La salida de cripta SHA 512 escrita con código Python es diferente de mkpasswd

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *