password_hash - php hash online
SHA1 vs md5 vs SHA256: ¿cuál usar para un inicio de sesión de PHP? (10)
Estoy haciendo un inicio de sesión de php, y estoy tratando de decidir si usar SHA1 o Md5, o SHA256 que leí en otro artículo de stackoverflow. ¿Alguno de ellos es más seguro que otros? Para SHA1 / 256, ¿sigo usando una sal?
Además, ¿es esta una forma segura de almacenar la contraseña como un hash en mysql?
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
Como señaló Johannes Gorset, la publicación de Thomas Ptacek de Matasano Security explica por qué las funciones de hash simples y de uso general, como MD5, SHA1, SHA256 y SHA512, son elecciones deficientes de contraseñas .
¿Por qué? Son demasiado rápidos: puede calcular al menos 1,000,000 de hash MD5 por segundo por núcleo con una computadora moderna, por lo que la fuerza bruta es factible contra la mayoría de las contraseñas que usa la gente. ¡Y eso es mucho menos que un clúster de servidores de craqueo basado en GPU!
Salar sin estirar la tecla solo significa que no puede calcular previamente la tabla del arcoíris, debe construirla ad hoc para esa sal específica. Pero realmente no hará las cosas mucho más difíciles.
El usuario @Will dice:
Todo el mundo está hablando de esto como que pueden ser pirateados a través de Internet. Como ya se mencionó, limitar los intentos hace que sea imposible descifrar una contraseña a través de Internet y no tiene nada que ver con el hash.
Ellos no necesitan hacerlo. Aparentemente, en el caso de LinkedIn , utilizaron la vulnerabilidad común de inyección SQL para obtener la tabla de inicio de sesión y descifraron millones de contraseñas fuera de línea.
Luego regresa al escenario de ataque fuera de línea:
La seguridad realmente entra en juego cuando toda la base de datos se ve comprometida y un pirata informático puede realizar 100 millones de intentos de contraseña por segundo contra el hash md5. SHA512 es aproximadamente 10,000 veces más lento.
No, SHA512 no es 10000 veces más lento que MD5; solo requiere el doble. Crypt / SHA512 , por otro lado, es una bestia muy diferente que, al igual que su contraparte de BCrypt, realiza el estiramiento de la clave , produciendo un hash muy diferente con una sal aleatoria incorporada y tomará entre 500 y 999999 veces más para calcular (estiramiento es sintonizable).
SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
Entonces, la opción para PHP es Crypt / Blowfish (BCrypt), Crypt / SHA256 o Crypt / SHA512. O al menos Crypt / MD5 (PHK). Consulte www.php.net/manual/en/function.crypt.php
Creo que usar md5 o sha256 o cualquier hash optimizado para la velocidad está perfectamente bien y tengo mucha curiosidad por escuchar cualquier refutación que otros usuarios puedan tener. Aquí están mis razones
Si permites que los usuarios usen contraseñas débiles como God, love, war, peace, entonces no importa el cifrado, aún estarás permitiendo que el usuario escriba la contraseña, no el hash, y estas contraseñas se usan primero, por lo tanto, esto NO va a funcionar. tener algo que ver con el cifrado.
Si no usas SSL o no tienes un certificado, los atacantes que escuchan el tráfico podrán acceder a la contraseña y cualquier intento de cifrado con javascript o similar será del lado del cliente y se rajará y superará fácilmente. De nuevo, esto NO tendrá nada que ver con el cifrado de datos en el lado del servidor.
Los ataques de fuerza bruta aprovecharán las contraseñas débiles y, de nuevo, porque permite al usuario ingresar los datos si no tiene la limitación de inicio de sesión de 3 o incluso un poco más, entonces el problema NO tendrá nada que ver con el cifrado de datos.
Si su base de datos se ve comprometida, lo más probable es que todo se haya visto comprometido, incluidas sus técnicas de hash, sin importar cuán críptico lo haya creado. De nuevo, esto podría ser un ataque de empleado XSS descontento o inyección SQL o algún otro ataque que no tiene nada que ver con el cifrado de su contraseña.
Creo que todavía debe encriptar, pero lo único que puedo ver es que la encriptación impide que las personas que ya han tenido acceso de alguna manera a la base de datos solo puedan leer en voz alta la contraseña. Si alguien no autorizado en la base de datos tiene problemas más importantes de los que preocuparse, esa es la razón por la cual Sony se llevó porque creían que una contraseña cifrada protegía todo, incluidos los números de las tarjetas de crédito. Todo lo que hace es proteger ese campo.
El único beneficio puro que puedo ver en encriptaciones complejas de contraseñas en una base de datos es retrasar a los empleados u otras personas que tienen acceso a la base de datos desde que acaban de leer las contraseñas. Entonces, si es un proyecto pequeño o algo por lo que no me preocupara demasiado por la seguridad del lado del servidor, me preocuparía más asegurar cualquier cosa que un cliente envíe al servidor, como inyección sql, ataques XSS o la gran cantidad de otras formas en que podría estar comprometido. Si alguien no está de acuerdo, espero leer una forma de que una contraseña súper cifrada sea obligatoria desde el lado del cliente.
La razón por la que quería intentar aclarar esto es porque con demasiada frecuencia las personas creen que una contraseña cifrada significa que no tienen que preocuparse de que se vea comprometida y dejan de preocuparse por proteger el sitio web.
Lo que la gente parece estar perdiendo es que si el pirata informático tiene acceso a la base de datos, probablemente también tenga acceso al archivo php que contiene la contraseña y probablemente solo pueda modificar eso para enviarle todas las combinaciones exitosas de contraseñas de nombre de usuario. Si no tiene acceso al directorio web, siempre puede elegir una contraseña y escribirla en la base de datos. En otras palabras, el algoritmo hash realmente no importa tanto como la seguridad del sistema, y limitando los intentos de inicio de sesión también si no usas SSL entonces el atacante puede simplemente escuchar la conexión para obtener la información. A menos que necesite que el algoritmo tarde mucho tiempo en computarse (para sus propios fines), SHA-256 o SHA-512 con una sal específica para el usuario deberían ser suficientes.
Como una medida de seguridad adicional, configure un script (bash, batch, python, etc.) o programa y asígnele un nombre oscuro y haga que verifique si login.php ha cambiado (verifique el sello de fecha / hora) y envíele un correo electrónico si tiene También debería registrar todos los intentos de inicio de sesión con derechos de administrador y registrar todos los intentos fallidos para iniciar sesión en la base de datos y recibir los registros por correo electrónico.
MD5 es malo debido a problemas de colisión: dos contraseñas diferentes que posiblemente generen el mismo md-5.
Sha-1 sería bastante seguro para esto. La razón por la que almacena la versión salada sha-1 de la contraseña es para que usted no mantenga la contraseña del usuario en el archivo, que pueden estar usando con los servidores de otras personas. De lo contrario, ¿qué diferencia hace?
Si el pirata informático le roba toda su base de datos sin cifrar de alguna forma, lo único que hace una contraseña sacada con hash es evitar que se haga pasar por el usuario para los inicios de sesión futuros: el hacker ya tiene los datos.
¿De qué le sirve al atacante tener el valor hash, si lo que el usuario ingresa es una contraseña simple?
E incluso si el pirata informático con tecnología futura pudiera generar un millón de claves sha-1 por segundo para un ataque de fuerza bruta, ¿manejaría su servidor un millón de inicios de sesión por segundo para que el pirata informático pruebe sus claves? Eso es si dejas que el pirata informático intente iniciar sesión con el Sha-1 salado en lugar de una contraseña como un inicio de sesión normal.
La mejor opción es limitar los intentos de inicio de sesión incorrectos a un número razonable, por ejemplo 25, y luego desconectar al usuario durante uno o dos minutos. Y si el inicio de sesión de bady acumulativo llega a 250 en 24 horas, cierre el acceso a la cuenta y envíe un correo electrónico al propietario.
MD5, SHA1 y SHA256 son resúmenes de mensajes, no funciones de hashing de contraseñas.
Actualmente, la única función de derivación de clave o derivación de clave estándar (como sancionada por NIST) es PBKDF2 . Otras opciones razonables, si no se requiere el uso de un estándar, son bcrypt , el scrypt más nuevo y el argon2i aún más nuevo . Wikipedia tiene páginas para estas funciones:
- http://en.wikipedia.org/wiki/PBKDF2
- http://en.wikipedia.org/wiki/Bcrypt
- http://en.wikipedia.org/wiki/Scrypt
- https://en.wikipedia.org/wiki/Argon2
Cambiar de MD5 a SHA1 o SHA512 no mejorará tanto la seguridad de la construcción. Computar un hash SHA256 o SHA512 es muy rápido. Un atacante con hardware común aún podría probar decenas de millones (con una sola CPU) o incluso miles de millones (con una sola GPU) de hashes por segundo. Las buenas funciones de hash de contraseñas incluyen un factor de trabajo para frenar a los atacantes.
Aquí hay algunas sugerencias para programadores de PHP: lea las preguntas frecuentes de PHP: http://php.net/manual/en/faq.passwords.php luego use uno de estos:
- la función estándar crypt () de PHP: http://fr.php.net/crypt :
- PHPPASS: http://www.openwall.com/phpass/
- PasswordHash: https://crackstation.net/hashing-security.htm
Ninguno. Deberías usar bcrypt
. Los hashes que mencionas están optimizados para ser rápidos y fáciles de usar en hardware, por lo que compartirlos comparte las mismas cualidades. Si no tiene otra opción, al menos asegúrese de utilizar una sal larga y repetir hash varias veces.
Usando bcrypt en PHP 5.5+
PHP 5.5 ofrece nuevas funciones para el hash de contraseñas . Este es el enfoque recomendado para el almacenamiento de contraseñas en aplicaciones web modernas.
// Creating a hash
$hash = password_hash($password, PASSWORD_DEFAULT, [''cost'' => 12]);
// If you omit the [''cost'' => 12] part, it will default to 10
// Verifying the password against the stored hash
if (password_verify($password, $hash)) {
// Success! Log the user in here.
}
Si está utilizando una versión anterior de PHP , realmente debe actualizar , pero hasta que lo haga, puede usar password_compat para exponer esta API.
Además, deje que password_hash()
genere la sal para usted. Utiliza un [CSPRNG] (http: //
Dos advertencias de bcrypt
- Bcrypt truncará silenciosamente cualquier contraseña de más de 72 caracteres.
- Bcrypt se truncará después de cualquier carácter
NUL
.
( Prueba de concepto para ambas advertencias aquí.)
Es posible que tenga la tentación de resolver la primera advertencia haciendo una mezcla previa de sus contraseñas antes de ejecutarlas a través de bcrypt , pero al hacerlo puede hacer que su aplicación se ejecute de manera directa en el segundo.
En lugar de escribir su propio esquema, use una biblioteca existente escrita y / o evaluada por expertos en seguridad.
-
Zend/Crypt
(parte de Zend Framework) ofreceBcryptSha
-
PasswordLock
es similar aBcryptSha
pero también encripta los hashes bcrypt con una biblioteca de cifrado autenticado .
TL; DR - Use bcrypt .
Supongamos el siguiente punto: los piratas informáticos roban nuestra base de datos, incluidos los usuarios y la contraseña (encriptados). Y los hackers crearon una cuenta falsa con una contraseña que ellos conocen.
MD5 es débil porque es corto y popular y prácticamente cada generación de hash sin contraseña es débil en un ataque de diccionario. Pero..
Entonces, digamos que todavía estamos usando MD5 con SALT. Los hackers no conocen la SALT pero conocen la contraseña de un usuario específico. Entonces pueden probar: ????? 12345 donde 12345 es la contraseña y ????? es la sal Los hackers tarde o temprano pueden adivinar la SAL.
Sin embargo, si utilizamos un SALT MD5 + y aplicamos MD5, entonces no hay forma de recuperar la información. Sin embargo, repito, MD5 todavía es corto.
Por ejemplo, digamos que mi contraseña es: 12345. La SAL es BILLCLINTON
md5: 827ccb0eea8a706c4c34a16891f84e7b
md5 con el hash: 56adb0f19ac0fb50194c312d49b15378
mD5 con el hash sobre md5: 28a03c0bc950decdd9ee362907d1798a Intenté usar esos servicios en línea y no encontré ninguno que pudiera descifrarlo. ¡Y es solo MD5! (Puede ser como hoy será crackeable porque generé el md5 en línea)
Si desea excederse, entonces SHA256 es más que suficiente si se aplica con una sal y dos veces.
tldr MD5 (HASH + MD5 (contraseña)) = bien pero corto, SHA256 es más que suficiente.
Todo el mundo está hablando de esto como que pueden ser pirateados a través de Internet. Como ya se mencionó, limitar los intentos hace que sea imposible descifrar una contraseña a través de Internet y no tiene nada que ver con el hash.
La sal es imprescindible, pero la complejidad o las sales múltiples ni siquiera importan. Cualquier sal por sí sola evita que el atacante use una mesa arcoiris prefabricada. Una sal única por usuario evita que el atacante cree una nueva tabla de arcoiris para usar en toda su base de usuarios.
La seguridad realmente entra en juego cuando toda la base de datos se ve comprometida y un pirata informático puede realizar 100 millones de intentos de contraseña por segundo contra el hash md5. SHA512 es aproximadamente 10,000 veces más lento. Una contraseña compleja con la potencia de hoy todavía podría tomar 100 años para la fuerza bruta con md5 y tomaría 10,000 veces más tiempo con SHA512. Las sales no detienen una fuerza bruta, ya que siempre deben conocerse, y si el atacante descargó su base de datos, probablemente esté en su sistema de todos modos.
Use SHA256
. No es perfecto, ya que SHA512
sería ideal para un hash rápido, pero fuera de las opciones, es la opción definitiva. De acuerdo con cualquier tecnología de hash, asegúrate de usar el hash para mayor seguridad.
Como nota adicional, FRKT, ¿por favor muéstrame dónde alguien puede romper fácilmente un hash SHA256 salado? Estoy realmente muy interesado en ver esto.
Edición importante:
En el futuro use bcrypt
como un hash endurecido. Más información se puede encontrar aquí .
Editar en salazón:
Use un número aleatorio o un flujo de bytes aleatorio, etc. También puede usar el campo único del registro en su base de datos como sal, de esta forma la sal es diferente por usuario.