¿Se fortalecen las contraseñas de unix / linux sha256 / sha512 en / etc / shadow key?
Sí. Utilizan un procedimiento de cripta que realiza un valor predeterminado de 5000 rondas de hash. El procedimiento sha256-crypt / sha512-crypt se describe aquí
y en java
¿Puedo cambiar el número de rondas?
Sí. Simplemente edite /etc/pam.d/passwd
o /etc/pam.d/common-password
(o el equivalente de solaris) y agregue 'rounds = 73500' al final de la línea que es similar a:
password [success=2 default=ignore] pam_unix.so obscure sha512 rounds=73500
y luego cambie su contraseña usando passwd. ¿Por qué 73500? Bueno, cronometrando cripta con rondas = 5000, obtuve unos 3.4 ms por contraseña. (5000 * 50 / 3.4 ~ 73500). Puede verificar si una contraseña en sus archivos / etc / shadow se realizó con un número anormal de rondas si parece que comienza con yourusername:$6$rounds=73500$RFzXZTGB$
donde $6$
indica el procedimiento de cripta utilizado (sha256-crypt es de $ 5 $, sha512-crypt $ 6 $ ) seguido por el número de rondas y luego la sal.
Pero quiero bcrypt; ¿Puedo cambiar a eso?
Verifique /etc/pam.d/ y (1) cambie todas las referencias de pam_unix.so
a pam_unix2.so
(verifique que el archivo esté allí) y (2) luego cambie de sha512
a blowfish
en / etc /pam.d/common-password
enlace
Una diferencia notable entre bcrypt vs sha512-crypt; es que el factor de trabajo bcrypt escala exponencialmente; por ejemplo, un factor de trabajo de 12, debería tomar el doble del tiempo que un factor de trabajo de 11, mientras que las rondas de sha512-crypt se escalan linealmente (por ejemplo, rounds=10000
debería tomar el doble de tiempo que rounds=5000
). Esto es simplemente porque bcrypt dice hacer 2 rondas work-factor . Como un punto de referencia rápido en mi máquina, una ronda de cifrado es más cara que una ronda de sha512-crypt; con una equivalencia aproximada de ~ 4 ms con rounds=5000
o work-factor=6
(2 6 = 64 bcrypt-rounds). Pero como ambos pueden ampliarse, esto no debería ser un problema hasta que el número de rondas desborda el int
sin signo de 32 bits / 64 bits (cuando rondas = 4 mil millones o 10 19 respectivamente).
Cosas de tiempo de Python con sha512-crypt
Puede verificar crypt a través de python (en linux, esto se realiza tan rápido como la versión C, ya que es solo una envoltura delgada para la biblioteca crypt escrita en C)
>>> import crypt
>>> crypt.crypt('testtest', '$6$6LzxTFam$')
En Python en mi máquina con el módulo crypt, se necesitan aproximadamente 3,4 ms por contraseña de sha512-crypt en 5000 rondas y ~ 50 ms con 73500 rondas.
>>> import timeit
>>> timer = timeit.Timer("crypt.crypt('testtest', '$6$6LzxTFam$')", setup="import crypt")
>>> timer.timeit(1000)
3.4215329647064209
# with 73500 rounds:
>>> timeit.Timer("crypt.crypt('testtest', '$6$rounds=73500$RFzXTGB$')", 'import crypt').timeit(1000)
50.738550186157227