Cómo crear hash de contraseña SHA512 en la línea de comando

83

En Linux puedo crear un hash de contraseña SHA1 usando sha1pass mypassword. ¿Existe una herramienta de línea de comando similar que me permita crear sha512hashes? La misma pregunta para Bcrypty PBKDF2.

estudiante
fuente
No quiere decir sha1sum?
1
@Tichodroma no, en realidad hay un sha1passcomando, parte del paquete syslinux-common en Debian.
derobert
2
Hay un sha512sumcomando que forma parte de coreutils, y de manera similar openssl sha512, pero tampoco lo hace el material adicional que sha1passsí lo hace.
Keith Thompson

Respuestas:

55

Sí, lo que está buscando mkpasswd, que (al menos en Debian) es parte del whoispaquete. No preguntes por qué ...

anthony@Zia:~$ mkpasswd -m help
Available methods:
des     standard 56 bit DES-based crypt(3)
md5     MD5
sha-256 SHA-256
sha-512 SHA-512

Desafortunadamente, mi versión al menos no hace bcrypt. Si su biblioteca C lo hace, debería (y la página de manual le da una opción -R para establecer la fuerza). -R también funciona en sha-512, pero no estoy seguro de si es PBKDF-2 o no.

Si necesita generar contraseñas de bcrypt, puede hacerlo de manera bastante simple con el Crypt::Eksblowfish::Bcryptmódulo Perl.

derobert
fuente
70

En cualquiera de las distribuciones de Red Hat, como Fedora, CentOS o RHEL, el comando mkpasswdno incluye el mismo conjunto de conmutadores que la versión que normalmente se incluye con Debian / Ubuntu.

NOTA: El comando mkpasswdes en realidad parte del expectpaquete y probablemente debería evitarse. Puede averiguar a qué paquete pertenece con cualquiera de estos comandos.

$ yum whatprovides "*/mkpasswd"
-or-
$ repoquery -q --file */mkpasswd

Ejemplo

$ repoquery -q --file */mkpasswd
expect-0:5.43.0-8.el5.x86_64
expect-0:5.43.0-8.el5.i386

Ambos métodos son superiores al uso rpmya que no es necesario instalar los paquetes para ubicarlos */mkpasswd.

Soluciones alternativas

Para solucionar este problema, puede usar las siguientes líneas de Python o Perl para generar contraseñas SHA-512. Tenga en cuenta que estos son salados:

Python (> = 3.3)

$ python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

-o guionizado-

$ python -c 'import crypt; print(crypt.crypt("somesecret", crypt.mksalt(crypt.METHOD_SHA512)))'

Python (2.xo 3.x)

$ python -c "import crypt, getpass, pwd; \
             print(crypt.crypt('password', '\$6\$saltsalt\$'))"

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

Nota: $ 6 $ designa sha512. El soporte para este método de especificar el algoritmo depende del soporte en la función de biblioteca crypt (3) a nivel del sistema operativo (generalmente en libcrypt). No depende de la versión de Python.

Perl

$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

En estos ejemplos, la contraseña es la cadena "contraseña" y la sal es "salesalt". Ambos ejemplos usan $ 6 $, lo que denota que desea que crypt use SHA-512.

slm
fuente
2
Para python one-liner, puede usar crypt.mksalt(crypt.METHOD_SHA512)para generar la sal en lugar de usar uno fijo.
Jake Cobb
2
@JakeCobb crypt.mksaltsolo está disponible en Python 3.x
Riccardo Murri
2
Antes de escribir una contraseña de texto sin cifrar en la línea de comando, asegúrese de tener "ignorespace" configurado en HISTCONTROL (es decir, haga esto primero en CentOS / RHEL: echo 'export HISTCONTROL = "ignoredups: ignorespace"'> /etc/profile.d /histcontrol.sh && source /etc/profile.d/histcontrol.sh). De lo contrario, se guardará en su ~ / .bash_history.
Patrick
3
los perl (y presumiblemente el pitón) usan la función del sistema "cripta". Por lo tanto, no son portátiles, requieren una función de cripta que comprenda el tipo de hash solicitado. La cripta OSX no lo hace, solo me devuelve una cadena encriptada DES de estilo antiguo.
Dan Pritts el
1
@RiccardoMurri Tengo Python 2.7.5 y tengo acceso a crypt.mksaltCentOS 7.1
user12345
15

Puede usar la doveadmutilidad, que se incluye en el dovecotpaquete.

doveadm pw -s SHA512-CRYPT

Ejemplo de resultado:

{SHA512-CRYPT}$6$0JvQ1LLFESzA16.I$JVdKAIq0igudTq06BMqzT9rL1gRawMPwLr9U3/kBMKUqZdONfa0wubC89C35LKl3aE16CRH57BfGb4ygPLggL1

Simplemente corte {SHA512-CRYPT} y obtendrá su cadena hash SHA512.

obohovyk
fuente
No funciona para mí como usuario habitual:doveadm(jotik): Fatal: Error reading configuration: stat(/etc/dovecot/dovecot.conf) failed: Permission denied (euid=1000(jotik) egid=100(users) missing +x perm: /etc/dovecot, we're not in group 97(dovecot), dir owned by 0:97 mode=0750)
jotik
12

Ejecute este comando:

$ /sbin/grub-crypt --sha-512

luego ingrese la palabra que desea hash.

ucemike
fuente
-bash: / sbin / grub-crypt: No existe tal archivo o directorio
Will Sheppard
No creo que grub esté en c7, así que puedes usar: python -c 'import crypt, getpass; print (crypt.crypt (getpass.getpass (), crypt.mksalt (crypt.METHOD_SHA512))) '
ucemike
3

Para ampliar las soluciones alternativas de @ slm anteriores, si le preocupa que alguien obtenga su historial de bash y vea la contraseña de texto sin formato, puede insertar raw_input()en la declaración de Python dónde van los campos de sal y contraseña para que se lo solicite. El texto no está enmascarado mientras escribe, pero no aparecerá en su historial de bash. También puede iniciar el comando con un espacio inicial, pero siempre me olvido de hacerlo.

python -c "import crypt, getpass, pwd; print crypt.crypt(raw_input(), '\$6\$' + raw_input() + '\$')"
usuario208145
fuente
2
También puede configurar bashpara no grabar comandos con el prefijo de un espacio que se agrega HISTCONTROL=ignorespacea su .bashrcarchivo. Cuando ejecuta un comando que desea excluir de su historial, simplemente escriba un espacio y luego el comando real.
theillien
1

sha512 htpasswd

Comando que solicita usuario y contraseña y genera un archivo htpasswd regular:

python -c 'import crypt,getpass; print(getpass.getpass("Name: ")+":"+crypt.crypt(getpass.getpass(),crypt.mksalt(crypt.METHOD_SHA512)))' >> htpasswd

Funciona con todas las versiones de python> 2.5.

MadMike
fuente
1

OpenSSL tiene

openssl passwd -6

La ayuda dice:

$ openssl passwd --help
Usage: passwd [options]
Valid options are:
...
 -6                  SHA512-based password algorithm
Markus Linnala
fuente
0

Si está utilizando el método Python (> = 2.7) de la respuesta de sim y desea confirmar su contraseña antes de que se genere, porque engorda las contraseñas de los dedos ...

$ python -c 'import crypt,getpass;pw=getpass.getpass(); print(crypt.crypt(pw), crypt.mksalt(crypt.METHOD_SHA512) if (pw==getpass.getpass("Confirm: ")) else exit())'
levi
fuente
En la versión del 29 de noviembre de 2017 de esta respuesta, dice que esto funciona para Python 2.7 (o posterior). El módulo de cripta de python2.7 no tiene mksalt (). También creo que desea que la llamada crypt.mksalt () sea el segundo argumento para crypt.crypt () (¿fuera de lugar cerca de paren?).
Juan
0

Versión de openssl "OpenSSL 1.1.1” en Linux y versión de openssl "LibreSSL 2.6.5” en MacOS compatible con md5_crypt.

Simplemente ejecute e ingrese la contraseña:

openssl passwd -crypt
Password:
Verifying - Password:
<results_into_a_md5_crypt_password>

o proporcione la contraseña de texto sin formato directamente a la CLI:

openssl password -crypt <plain_text_password_goes_here>
<results_into_a_md5_crypt_password>
TMT
fuente
-12

Puedes usar sha512sum:

echo "password" | sha512sum
Vinayak
fuente
24
Esta respuesta es incorrecta. El comando no generará un hash de contraseña SHA-512 válido . Simplemente calculará la suma de comprobación de la contraseña de cadena \ n (tenga en cuenta que también hay una nueva línea al final). Los hashes de contraseñas de Unix son salados e incluyen un código de versión de hash entre dos símbolos "$". Ver la respuesta de @slm.
zorlem
Más específicamente, el problema es que si bien la contraseña está algo ofuscada, este método es vulnerable a un ataque en.wikipedia.org/wiki/Rainbow_table .
DepressedDaniel