2012-06-13 9 views
6

Tengo un sitio web que lee/verifica (y escribe) hashes de contraseñas de la base de datos, y tengo algo que hace hashes de contraseña de estilo SHA-512 para eso que se parece a:Creación de hashes glipt 2.7 estilo Sha-512 crypt en Perl

$6$GloHensinmyampOc$AxvlkxxXk36oDOyu8phBzbCfLn8hyWgoYNEuqNS.3dHf4JJrwlYCqha/g6pA7HJ1WwsADjWU4Qz8MfSWM2w6F. 

El sitio web está basado en Java, así que escribí un hasher SHA-512 para él. El problema es que hay un montón de trabajos de cron de Perl que ejecutan y también necesitan verificar hash de contraseñas ocasionalmente en la base de datos, y dado que esos se ejecutan en un cuadro de Solaris, crypt no admite el formato $ 6 $.

Así, cuando lo haga:

printf("crypt => '%s'\n",crypt("Hello",'$1$CygnieHyitJoconf$')); 

regrese con sensatez:

crypt => '$1$CygnieHy$n9MlDleP0qmGCfpbnVYy11' 

Considerando que, si lo hago

printf("crypt => '%s'\n",crypt("Hello",'$6$CygnieHyitJoconf$')); 

me sale un poco útil

crypt => '' 

¿Hay alguna manera de obtener los valores hash de contraseña SHA-512 en Perl en un cuadro que no utiliza glibc? (Eso es lo que me dicen cuando hago una búsqueda en su mayoría (el "uso de la cripta").

Realmente preferiría no volver a implementar SHA-512 hashes de contraseñas en Perl.

Gracias!

Respuesta

3

Desafortunadamente no. crypt será su sistema libc crypt, que es responsable de elegir algoritmos y mapear cadenas de prefijos a los algoritmos. Si desea acceder a algoritmos que no están en su sistema crypt, entonces deberá usar una reimplementación de ellos, y en el caso de los libc, no sé de ninguna reimplementación. El hash de contraseñas "SHA-512" de glibc no es simplemente SHA-512, es un algoritmo personalizado que no existe fuera de glibc que yo sepa. Si todavía tienes la oportunidad, tal vez quieras cambiar a un algoritmo como bcrypt o PBKDF-SHA-2 que tenga implementaciones múltiples en diferentes idiomas.

+0

No es tanto un algoritmo personalizado como un algoritmo diferente. Es sha512crypt. SHA512 está diseñado para ser RÁPIDO, que es lo contrario de lo que desea para una función de hashing de contraseña. Sigue el estándar crypt (3) junto con bcrypt, y admite complejidad variable (un número variable de 'rondas' para hacerlo más fuerte en el futuro cuando las 5000 rondas predeterminadas ya no son suficientes). crypt (3) es siempre lo que debes usar para el hashing de contraseñas. nada más, nunca. –

7

En realidad, creo que acabo de encontrar mi propia respuesta: Crypt::Passwd::XS

Crypt :: :: Passwd XS - XS aplicación completa de la cripta común() algoritmos

Lo hace unix_md5, apache_md5, unix_des, unix_sha256 y unix_sha512 .. Supongo que es un poco desafortunado que no sea blowfish. ¡Pero, sin embargo, resuelve mi problema! ¡Gracias @hobbs de todas formas!

use strict; 
use Crypt::Passwd::XS; 

{ 
     printf("crypt => %s\n",Crypt::Passwd::XS::crypt("Hello",'$6$CygnieHyitJoconf$')); 
} 

ahora vuelve

crypt => $6$CygnieHyitJoconf$vkGJm.nLrFhyWHhNTvOh9fH/k7y6k.8ed.N7TqwT93hPMPfAOUsrRiO3MmQB5xTm1XDCVlW2zwyzU48epp8pY/ 

como se esperaba!

+0

Hola, genial.Tomaré nota :) – hobbs

+0

Oh, la divertida ironía. Un módulo llamado "Crypt :: Passwd :: XS" que contiene SOLO algoritmos que NUNCA deberías usar para contraseñas. bcrypt o PBKDF * chicos, y si no entiendes por qué, será mejor que vayas a leer. ¡Es sutil, pero es solo la diferencia entre "inútil" y "funciona"! – cnd

+0

¿De verdad? ¿Por qué no deberías usar unix_sha512? Sale, y hasta donde sé, todavía es resistente a las colisiones ...? – bnsh

Cuestiones relacionadas