Hash SHA1 para autenticación web en lugar de Blowfish

Al no poder ubicar una implementación php / javascript de blowfish que funcione, ahora estoy considerando usar el hash SHA1 para implementar la autenticación basada en web, pero la falta de conocimiento en este campo en particular me hace inseguro de si el método elegido es lo suficientemente seguro.

La hoja de ruta planificada:

  1. La contraseña del usuario se almacena en el servidor como un hash MD5.
  2. El servidor emite una clave pública (hash MD5 de la hora actual en milisegundos)
  3. La función de javascript del cliente toma la contraseña del usuario como entrada y calcula su hash MD5
  4. Luego, el cliente concatena el hash de la clave pública y la contraseña de arriba, y calcula SHA1 de la cadena resultante
  5. El cliente envía el hash SHA1 al servidor, donde se realizan cálculos similares con la clave pública y el hash MD5 de la contraseña del usuario.
  6. El servidor compara los hashes, una coincidencia indica una autenticación exitosa.
  7. Una falta de coincidencia indica un error de autenticación y el servidor emite una nueva clave pública, caducando efectivamente la que ya se usó.

Ahora, la parte problemática es sobre la concatenación de dos claves antes de SHA1, ¿podría ser propenso a algún tipo de ataque estadístico o de otro tipo?

¿Existe algún orden específico en el que las claves deben concatenarse para mejorar la calidad general (es decir, los bits más altos son más importantes para la confiabilidad del cifrado)?

Gracias de antemano.

preguntado el 09 de enero de 11 a las 12:01

2 Respuestas

Si solo está utilizando la 'clave pública' (que en realidad no es una clave pública, es una nuncio apostólico, y realmente debería ser aleatorio, a menos que realmente desee que se pueda usar durante un cierto período de tiempo, en cuyo caso asegúrese de usar HMAC con una clave secreta para generarlo para que un adversario no pueda predecir el nonce) para prevenir ataques de repetición, y tiene un tamaño fijo, la concatenación podría no ser un problema.

Dicho esto, me preocupa un poco que no tenga un modelo de seguridad bien pensado. ¿Qué ataque está tratando de prevenir, de todos modos? El hash de la contraseña del usuario no tiene sal, por lo que una ruptura de su base de datos de contraseñas revelará contraseñas de texto sin formato con bastante facilidad de todos modos, y aunque tener un nonce por tiempo limitado mitigará los ataques de repetición de un rastreador pasivo, dicho rastreador pasivo podría robar la clave de sesión del usuario de todas formas. Hablando de eso, ¿por qué no usar la clave de sesión como nonce en lugar de un sistema basado en marcas de tiempo?

Pero realmente, ¿por qué no usar SSL? La criptografía es realmente difícil para hacerlo bien, y personas mucho más inteligentes que usted o yo hemos pasado décadas revisando la seguridad de SSL para hacerlo bien.

Editar: Si está preocupado por los ataques MITM, nada menos que SSL lo salvará. Período. Mallory puede simplemente reemplazar su formulario de inicio de sesión súper seguro con uno que le envíe la contraseña en texto plano. Juego terminado. E incluso un atacante pasivo puede ver todo lo que pasa por el cable. incluyendo su cookie de sesión. Una vez que Eve tiene la cookie de sesión, simplemente la inyecta en su navegador y ya ha iniciado sesión. Juego terminado.

Si dice que no puede usar SSL, debe analizar detenidamente qué es exactamente lo que está tratando de proteger y qué tipo de ataques mitigará. Probablemente necesitará implementar una aplicación de escritorio de algún tipo para hacer la criptografía; si los MITM están funcionando, entonces no puede confiar en NINGUNO de sus HTML o Javascript; Mallory puede reemplazarlos a voluntad. Por supuesto, su aplicación de escritorio deberá implementar el intercambio de claves, el cifrado y la autenticación en el flujo de datos, además de la autenticación del host remoto, que es exactamente lo que hace SSL. Y probablemente usará prácticamente los mismos algoritmos que SSL para hacerlo, si lo hace bien.

Si decide que los MITM no están dentro del alcance, pero desea protegerse contra ataques pasivos, probablemente necesite implementar alguna criptografía seria en Javascript; estamos hablando de una Diffie-Hellman intercambio para generar una clave de sesión que nunca se envía a través del cable (Almacenamiento web HTML5, etc.), AES en Javascript para proteger la clave, etc. Y en este punto básicamente ha implementado la mitad de SSL en Javascript, solo hay posibilidades de que haya más errores, entre los cuales se encuentra el problema de que es bastante difícil para obtener números aleatorios seguros en Javascript.

Básicamente, puede elegir entre:

  1. No implementar ninguna seguridad criptográfica real (aparentemente no es una opción, ya que está implementando todos estos complejos protocolos de autenticación)
  2. Implementar algo que se parece mucho a SSL, solo que probablemente no tan bueno
  3. Usando SSL.

En resumen, si la seguridad importa, usar SSL. Si no tiene SSL, instalarlo. Todas las plataformas que conozco que pueden ejecutar JS también pueden manejar SSL, por lo que realmente no hay excusa.

Respondido el 09 de enero de 11 a las 16:01

Gracias por su respuesta. SSL no es una opción que pueda controlar, el sistema en cuestión está diseñado para su uso en el entorno del cliente que puede no admitir SSL en absoluto. Las contraseñas de los usuarios no tienen sal, es cierto, pero por el momento estamos evaluando la protección contra ataques man-in-the-middle, supongo. Ahora bien, ¿cómo se puede usar un ataque de repetición si el nonce es bastante aleatorio y, por definición, es de un solo uso? - Dennis Kreminsky

Si está preocupado por los ataques MITM, nada menos que SSL lo salvará. Período. Mallory puede simplemente reemplazar su formulario de inicio de sesión súper seguro con uno que le envíe la contraseña en texto plano. Juego terminado. E incluso un atacante pasivo puede ver todo lo que pasa por el cable. incluyendo su cookie de sesión. Una vez que Eve tiene la cookie de sesión, simplemente la inyecta en su navegador y ya ha iniciado sesión. bdonlan

En cuanto al nonce, los ataques de predicción de nonce no son realmente relevantes aquí: uno intentaría convencer al usuario de que inicie sesión con un nonce que genera el atacante, utilizando una marca de tiempo futura conocida. El usuario envía el hash al atacante, quien luego espera hasta que llegue la marca de tiempo y luego inicia sesión con el hash de autenticación del usuario. Sin embargo, cualquier ataque que permita esto probablemente permitiría que su javascript de inicio de sesión sea reemplazado por un código malicioso de todos modos. - bdonlan

Muchas gracias, creo que veo el punto y lo consideraré más en serio. - Dennis Kreminsky

+1 para "La criptografía es realmente difícil de hacer bien, y personas mucho más inteligentes que usted o yo hemos pasado décadas revisando la seguridad de SSL para hacerlo bien". - Marcus Downing

bdonlan tiene toda la razón. Como se señaló, un adversario solo necesita reemplazar su formulario Javascript con un código maligno, que será trivial a través de HTTP. Entonces se acabó el juego.

También sugeriría mirar mover sus contraseñas a SHA-2 con sales, generadas usando un generador criptográfico de números aleatorios adecuado (es decir, NO sembradas usando el reloj del servidor). Además, realice el hash varias veces. Ver http://www.jasypt.org/howtoencryptuserpasswords.html secciones 2 y 3.

MD5 está roto. No utilice MD5.

Su esquema seguro debe ser similar al siguiente:

  1. Todo sucede en SSL. El formulario de autenticación, el script del lado del servidor que verifica el formulario, las imágenes, etc. No es necesario hacer nada especial aquí, porque SSL hace todo el trabajo duro por usted. Solo un formulario HTML simple que envía el nombre de usuario / contraseña en "texto sin formato" es todo lo que realmente se necesita, ya que SSL encriptará todo.

  2. El usuario crea una nueva contraseña: usted genera una sal aleatoria (NO basada en la hora del servidor, sino de una buena fuente aleatoria de cifrado). Hash the salt + la nueva contraseña muchas veces, y almacena la sal y el hash resultante en tu base de datos.

  3. Verificar contraseña: su secuencia de comandos busca salt para el usuario y utiliza el hash de salt + contraseña ingresada muchas veces. Busque coincidencias en la base de datos.

Lo único que debe almacenarse en su base de datos es la sal y el hash / digest.

Suponiendo que tiene una base de datos de hash MD5 que necesita admitir, entonces la solución podría ser agregar columnas de base de datos para nuevos hash y sales SHA-2. Cuando el usuario inicia sesión, verifica el hash MD5 como lo ha estado haciendo. Si funciona, siga los pasos en "el usuario crea una nueva contraseña" para convertirla a SHA-2 & salt, y luego elimine el antiguo hash MD5. El usuario no sabrá qué pasó.

Todo lo que realmente se desvíe de esto probablemente tendrá algunas fallas de seguridad.

Respondido el 11 de enero de 11 a las 20:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.