¿Cómo crear una contraseña hash SHA-512 para shadow?

62

Las preguntas anteriores de SF que he visto han llevado a respuestas que producen una contraseña hash MD5.

¿Alguien tiene una sugerencia para producir una contraseña hash SHA-512? Prefiero un trazador de líneas en lugar de un guión, pero si un guión es la única solución, también está bien.

Actualizar

Reemplazar versiones anteriores de py2 con esta:

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"
Belmin Fernandez
fuente
44
SHA y MD5 no son cifrados. Son algoritmos hash. La diferencia crucial es que los datos hash no son recuperables. ¿Qué es lo que hay que hacer?
SmallClanger
Gracias. Modificado la pregunta. man 5 shadowse refiere a ella como "contraseña cifrada", así que seguí ese término.
Belmin Fernández el
2
Disculpas si eso fue un poco sarcástico. ¿Estás tratando de generar manualmente hashes de contraseñas compatibles con shadow? Si es así, eche un vistazo a sus /etc/shadowcontenidos. Ya veras $x$salt$hash. xdenota el algoritmo utilizado por crypt, 6siendo típico en linuxes modernos, que es sha512 (ver man 3 crypt). Cualquiera de las respuestas a continuación producirá el mismo hash, siempre que le des la misma sal.
SmallClanger
2
Oh no, no sarcástico en absoluto. Usted aclaró algo sobre lo que estaba confundido, así que estoy muy agradecido, señor.
Belmin Fernández el
1
¡Gracias! El basado en passlib es el único que he podido hacer funcionar en OS X.
Stig Brautaset

Respuestas:

65

Aquí hay un trazador de líneas:

python -c 'import crypt; print crypt.crypt("test", "$6$random_salt")'

Python 3.3+ incluye mksalten la cripta , lo que hace que sea mucho más fácil (y más seguro) de usar:

python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'

Si usted no proporciona un argumento para crypt.mksalt(que podría aceptar crypt.METHOD_CRYPT, ...MD5, SHA256, y SHA512), se utilizará el más fuerte disponible.

El ID del hash (número después del primero $) está relacionado con el método utilizado:

  • 1 -> MD5
  • 2a -> Blowfish (no en glibc de línea principal; agregado en algunas distribuciones de Linux)
  • 5 -> SHA-256 (desde glibc 2.7)
  • 6 -> SHA-512 (desde glibc 2.7)

Te recomiendo que busques qué son las sales y tal, y según smallclamgers comenta la diferencia entre cifrado y hash.

Actualización 1: la cadena producida es adecuada para scripts shadow y kickstart. Actualización 2: Advertencia. Si está utilizando una Mac, vea el comentario sobre cómo usar esto en Python en una Mac donde no parece funcionar como se esperaba.

davey
fuente
55
Reemplazar random_saltcon una sal al azar real.
Belmin Fernández
66
No puedo hacer que esto funcione en Yosemite. Esto es lo que escupe: ¡ $6asQOJRqB1i2eso no parece lo suficientemente largo como para ser correcto!
Stig Brautaset
3
Deje que el módulo cripta hacer la sal para usted: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza
2
glibc por defecto solo usa 5000 rondas, lo cual es bastante débil en estos días. Se puede especificar el número de rondas mediante la adición de "$ = ### rondas", por ejemplo: crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000 toma alrededor de 100 ms en mi computadora portátil actual.
srparish
2
Esto no debe usarse, al menos en una Mac. En una Mac (10.13.5) esto devuelve el mismo resultado incorrecto cada vez.
oskarpearson
37

En Debian puede usar mkpasswd para crear contraseñas con diferentes algoritmos de hash adecuados para / etc / shadow. Está incluido en el paquete whois (según apt-file)

mkpasswd -m sha-512
mkpasswd -m md5

para obtener una lista de tipos de algoritmos de hashing disponibles:

mkpasswd -m help 

HTH

mrossi
fuente
3
¿Qué paquete lo proporciona? También hay un mkpasswdprograma (parte de esperar) en Fedora, pero es inútil para este propósito.
Cristian Ciupitu
Como dijo, la versión de la mkpasswdque está hablando es para Debian / Ubuntu. El mkpasswden Fedora (al menos hasta 14) no tiene el -minterruptor.
slm
3
Curiosamente, es el paquete whois, legado de Debian. Mira, dpkg -S /usr/bin/mkpasswdno podía creerlo: D
Rbjz
Para verificar una contraseña, si el primer dígito es 6, use la parte entre el segundo y el tercer dólar como sal. Por ejemplo, para root:$6$AbCdE$xyz:...que puedes usar: mkpasswd -m sha-512 -S AbCdE. Con la contraseña correcta, debe obtener el mismo hash.
Luc
24

La mejor respuesta: grub-crypt

Usage: grub-crypt [OPTION]...
Encrypt a password.

-h, --helpPrint this message and exit
-v, --version           Print the version information and exit
--md5                   Use MD5 to encrypt the password
--sha-256               Use SHA-256 to encrypt the password
**--sha-512             Use SHA-512 to encrypt the password (default)**
Wayne
fuente
1
Solución simple
funcionó
44
En los sistemas que tienen el grub-cryptcomando, esta es realmente la forma más infalible y conveniente de hacerlo. No tiene sentido jugar con sales manualmente cuando podrías arruinarlo. El problema es que cada vez más sistemas modernos tienen GRUB2 y, por lo tanto, no incluirán este comando.
rsaw
11

Aquí hay un código C corto para generar la contraseña SHA-512 en varios sistemas operativos tipo Unix.

Expediente: passwd-sha512.c

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  if ( argc < 3 || (int) strlen(argv[2]) > 16 ) {
    printf("usage: %s password salt\n", argv[0]);
    printf("--salt must not larger than 16 characters\n");
    return;
  }

  char salt[21];
  sprintf(salt, "$6$%s$", argv[2]);

  printf("%s\n", crypt((char*) argv[1], (char*) salt));
  return;
}

compilar:

/usr/bin/gcc -lcrypt -o passwd-sha512 passwd-sha512.c

uso:

passwd-sha512 <password> <salt (16 chars max)>
BoogieBug
fuente
Esta pregunta tiene 3 años ...
Gruñón
Este comentario no es tan viejo. Linda aplicación que tienes allí, eso es solo una respuesta c allí arriba incluso cuando parece un ejemplo de página de manual :)
Sampo Sarrala
4

Solución Perl one-liner para generar la contraseña hash SHA-512:

perl -le 'print crypt "desiredPassword", "\$6\$customSalt\$"'

Trabajó en RHEL 6

Ivan Chau
fuente
2

¿Por qué no realizar la siguiente verificación y modificación en las máquinas Centos / RHEL para garantizar que todo el hashing de contraseñas para / etc / shadow se realice con sha512? Luego puede configurar su passworkd normalmente con el comando passwd

#Set stronger password hasing
/usr/sbin/authconfig --test | grep sha512 > /dev/null
if [ $? -ne 0 ]; then
echo "Configuring sha512 password hashing"
sudo /usr/sbin/authconfig --enableshadow --passalgo=sha512 --updateall
fi
ckliborn
fuente
2

Aquí hay una línea que usa comandos de shell para crear una contraseña hash SHA-512 con una sal aleatoria:

[root @ host] mkpasswd -m sha-512 MyPAsSwOrD $ (openssl rand -base64 16 | tr -d '+ =' | head -c 16)

Notas

  1. Es posible que deba instalar el paquete "whois" (Debian, SuSE, etc.), que proporciona "mkpasswd".
  2. Ver crypt (3) para detalles sobre el formato de líneas en "/ etc / shadow".
ajchace
fuente
Lamentablemente, el whoispaquete de Fedora 18 no proporciona ninguno mkpasswd.
Cristian Ciupitu
1
En Arch Linux: / usr / bin / mkpasswd es propiedad de wait 5.45-3
Nowaker
Lo mismo en Fedora 20 y hace algo más.
Cristian Ciupitu
2
Desafortunadamente, el comando sugerido tiene dos problemas: 1) La contraseña provista ahora se almacena en el historial de su shell y es visible para cualquier persona con el comando 'history' o similar. 2) No es necesario que proporcione la sal aleatoria en la línea de comando, y creo que debería dejar que mkpasswd lo haga por usted en lugar de utilizar trucos funky openssl. (Tenga en cuenta que esto es cierto al menos en Ubuntu Quantal. Puede probarlo ejecutando 'mkpasswd -m sha-512 foo' varias veces. Verá los cambios de sal. La sal es el valor entre el segundo y el tercer $ caracteres. )
oskarpearson
2

Lea el comentario a continuación para conocer las implicaciones de seguridad de esta respuesta.

Para aquellos de la mentalidad de Ruby aquí hay una frase:

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))
TrueDuality
fuente
1
Esto es incorrecto: la función rand de Ruby no es segura: utiliza un PRNG, por lo que generará resultados que pueden ser modificados en función de una conjetura del tiempo / estado del momento en que ejecutó esto.
oskarpearson
1

Este script funcionó para mí en Ubuntu 12.04 LTS: https://gist.github.com/JensRantil/ac691a4854a4f6cb4bd9

#!/bin/bash
read -p "Enter username: " username
read -s -p "Enter password: " mypassword
echo
echo -n $username:$mypassword | chpasswd -S -c SHA512

Tiene las siguientes características de las que carecen algunas de las otras alternativas:

  • Genera su sal de forma segura. Nadie debería confiar en hacer esto manualmente. Siempre.
  • no almacena nada en el historial de shell.
  • Para mayor claridad, imprime la contraseña de usuario que generó, lo que puede ser bueno al generar las contraseñas de muchos usuarios.
Ztyx
fuente
2
Tenga en cuenta que esto solo funcionará si tiene chpasswden su sistema.
Matt Sanders
FYI: chpasswd no es compatible con -S en shadow-utils-4.1.5.1
Saustrup
0

Los algos HASH son para producir resúmenes de MENSAJES, nunca son adecuados para contraseñas, que deberían usar algún tipo de HKDF ( http://tools.ietf.org/rfc/rfc5869.txt ) - vea PBKDF2 o BCrypt

Chris
fuente
Buen punto, pero man cryptme dice que PBKDF2 no es compatible.
Huygens
0
#!/usr/bin/env python

import getpass

from passlib.hash import sha512_crypt

if __name__ == "__main__":
    passwd = getpass.getpass('Password to hash: ')
    hash = sha512_crypt.encrypt(passwd)

    print hash

Puede clonarlo desde mi repositorio github si lo desea: https://github.com/antoncohen/mksha

Anton Cohen
fuente
0

No es un trazador de líneas, pero podría ayudar a alguien:

import crypt, getpass, pwd, string, sys, random
randomsalt = ""
password = getpass.getpass()
choices = string.ascii_uppercase + string.digits + string.ascii_lowercase
for _ in range(0,8):
    randomsalt += random.choice(choices)
print crypt.crypt(password, '$6$%s$' % randomsalt)
jordixou
fuente
randomno es criptográficamente seguro, os.urandomdebe usarse. 8 caracteres del diccionario de 56 caracteres es demasiado pequeño también. Concatenar una picadura una y otra vez en python también es una mala forma (tiene complejidad O (n ^ 2))
Hubert Kario
0
$ htpasswd -c /tmp/my_hash user1
New password: 
Re-type new password: 
Adding password for user user1
$ cat /tmp/my_hash
user1:$apr1$oj1ypcQz$4.6lFVtKz2nr8acsQ8hD30

Obviamente, simplemente agarra el segundo campo y puede eliminar el archivo una vez que lo haya agregado a la sombra o para usarlo con sudo (aún probablemente sombra).

Joshua Gies
fuente
0

Eche un vistazo a la página de manual de crypt (3) y creo que encontrará que la herramienta de cripta se ha actualizado para usar glibc y sha256 ($ 5) y sha512 ($ 6), rondas múltiples, sal mucho más grande, etc. .

Claramente, SHA512 es relevante para cómo funciona / etc / shadow.

Dicho esto, esta página web fue muy útil, en particular la MKPASSWD, ya que esto resolvió MI problema.

Dada una contraseña potencialmente "perdida", puedo usar MKPASSWD y la sal, para generar el hash SHA512 y confirmar / denegar una lista de contraseñas candidatas.

Usaría a John el destripador, pero al menos en mi hardware (Raspberry Pi) y mi presupuesto (nada), John no puede hacerlo (no parece admitir las cosas avanzadas de crypt / glibc en la versión gratuita de raspbian).

Eso sí, ya que tengo suficiente permiso para leer / escribir / etc / shadow, PODRÍA sobrescribir el hash y seguir con la vida ... este es un ejercicio académico.


NOTAS Notas de Glibc La versión glibc2 de esta función admite algoritmos de cifrado adicionales.

   If salt is a  character  string  starting  with  the  characters
   "$id$" followed by a string terminated by "$":

          $id$salt$encrypted

   then instead of using the DES machine, id identifies the encryp‐
   tion method used and this then determines how the  rest  of  the
   password  string is interpreted.  The following values of id are
   supported:

          ID  | Method
          ─────────────────────────────────────────────────────────
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

   So  $5$salt$encrypted  is  an  SHA-256  encoded   password   and
   $6$salt$encrypted is an SHA-512 encoded one.
joeomniback
fuente
0

Si necesita una alternativa a las líneas escritas en perl / python, mkpasswd es una buena combinación. Si bien está incluido en el paquete whois de Debian, falta en los sistemas CentOS / RHEL. Modifiqué la versión Debian de mkpasswd e incluí un mecanismo de generación de sal más fuerte basado en OpenSSL. El binario resultante conserva completamente todos los parámetros de la línea de comandos de la versión de Debian. El código está disponible en github y debe compilarse en cualquier versión de Linux: mkpasswd

Liviu
fuente
-4

No estoy seguro de cómo se relaciona SHA-512 /etc/shadow. Estas contraseñas son crypted.

Pero si desea un hash de contraseña con SHA-512, puede hacerlo echo -n the_password | sha512sum. No puede usar la salida para / etc / shadow.

mailq
fuente
2
echo -n the_passwordasí que no estás haciendo hash la nueva línea. </
pedant
Las contraseñas en shadowya no se han cifrado () desde hace años. Los sistemas modernos usan al menos md5.
Alexander Janssen
66
En realidad, las contraseñas shadowaún se crypt()editan, pero la función se ha actualizado para admitir varios algoritmos diferentes. Independientemente, el método descrito en esta respuesta no produce hash adecuado para /etc/shadow. El algoritmo es más complejo que una sola ronda hash SHA-512.
snap