¿Debería usarse BCRYPT para el hashing de contraseñas del lado del cliente?

5

Me preocupa el uso de bcrypt para la generación de contraseñas del lado del cliente. Estoy desarrollando una función de generación de contraseña para ser utilizada en el lado del cliente, similar a PwdHash y PasswordMaker.

Mucho se ha dicho acerca de la ventaja de usar bcrypt sobre funciones hash más rápidas porque ralentiza los ataques de fuerza bruta. Sé que bcrypt usa Blowfish internamente, que es un algoritmo de cifrado simétrico en lugar de un algoritmo hash. Por lo tanto, debe haber una clave codificada en algún lugar para usar bcrypt, y dado que se está utilizando Blowfish, es lógico que si se descubre la clave, la derivación de la contraseña se puede invertir y la contraseña original.

Dado que el código del lado del cliente se puede descompilar, la clave se puede descubrir fácilmente, haciendo que bcrypt no sea seguro para usar del lado del cliente. ¿Mi razonamiento es correcto o me he perdido algo?

Además, en una pregunta relacionada, el mismo argumento no sería válido también en el lado del servidor. Una función hash no se puede revertir, pero una función de cifrado puede ser si se conoce la clave. ¿No sería más seguro utilizar un servidor hash real, incluso si es más rápido y, por lo tanto, más susceptible al ataque de fuerza bruta que a usar bcrypt, que es reversible?

EDITAR: usuario10008 señala a continuación (se ha eliminado la publicación) que solo se utilizan partes de Blowfish en bcrypt y me dio un enlace. Cuando seguí un enlace, encontré un prototipo de función que incluye clave como último argumento. Así que todavía veo la clave que se usa para poner en marcha el algoritmo bcrypt. Si se requiere la clave y bcrypt utiliza cifrado simétrico en lugar de hash, ¿no es reversible la operación?

EDITAR: Buenas respuestas de martinstoeckli y user10008. Le di la respuesta a marginstoeckli debido a la última oración de la respuesta:

BCrypt se puede ver como encriptación con la eliminación de la clave.

Esto realmente se aclaró. para mi Básicamente, pasamos por 2 fases

P - > K; P, K - > C

y luego deseche la clave K, dejando el cyphertext C. Debido a que desechamos la clave K, no podemos descifrar al texto simple P. Desechar K hace que bcrypt sea una función unidireccional.

EDITAR: Del usuario 10008, los pasos que he dado anteriormente son más complejos, sin embargo, la esencia es que la tecla K se usa en la fase final y se descarta. Gracias usuario10008.

    
pregunta Ken Clubb 24.08.2014 - 20:28
fuente

5 respuestas

6

Es al revés, BCrypt no cifra la contraseña con una clave secreta, sino que utiliza la contraseña como clave para cifrar un texto conocido. En la configuración donde se genera la clave, usa tanto salt como la contraseña (variable EksBlowfishSetup.key ), para generar una clave (variable bcrypt.state ) utilizada para el cifrado.

bcrypt(cost, salt, input)
    state \gets EksBlowfishSetup(cost, salt, input)
    ctext \gets "OrpheanBeholderScryDoubt" //three 64-bit blocks
    repeat (64)
        ctext \gets EncryptECB(state, ctext) //encrypt using standard Blowfish in ECB mode
    return Concatenate(cost, salt, ctext)

EksBlowfishSetup(cost, salt, key)
    state \gets InitState()
    state \gets ExpandKey(state, salt, key)
    repeat (2cost)
        state \gets ExpandKey(state, 0, key)
        state \gets ExpandKey(state, 0, salt)
    return state

BCrypt se puede ver como cifrado con la eliminación de la clave.

    
respondido por el martinstoeckli 25.08.2014 - 09:52
fuente
4

Bcrypt no es reversible. Puede usarlo tanto en el lado del cliente como en el lado del servidor.

La clave no es estática sino que depende de la contraseña, generada por la función call EksBlowfishSetup(cost, salt, input) . El texto plano es conocido y público, su "OrpheanBeholderScryDoubt" . Si desea recuperar la clave, deberá montar un ataque de texto sin formato conocido en 64-times-blowfish , que es muy difícil, y aún así solo obtendrías la clave, y no la contraseña.

Wikipedia proporciona una descripción general de pseudocódigo del algoritmo bcrypt :

 bcrypt(cost, salt, input)
     state ← EksBlowfishSetup(cost, salt, input)
     ctext ← "OrpheanBeholderScryDoubt" //three 64-bit blocks
     repeat (64)
         ctext ← EncryptECB(state, ctext) //encrypt using standard Blowfish in ECB mode
     return Concatenate(cost, salt, ctext)
    
respondido por el user10008 24.08.2014 - 21:39
fuente
2

Editado para agregar: Resulta que lo que he escrito es correcto, pero no es una respuesta a la pregunta que se hizo. Me disculpo.

Lo que sea que envíe desde el cliente al servidor es la contraseña, ya sea que se haya copiado, cortado o cortado. Una contraseña con hash en el cliente no es más segura que la misma cadena, sin romper. Si es interceptado, puede usarse para un ataque de repetición en cualquier caso.

Lo importante es asegurarse de que la contraseña se transmita encriptada , por ejemplo. con SSL / TLS.

Eche un vistazo a esto para obtener una explicación más completa: enlace

    
respondido por el Bob Brown 24.08.2014 - 21:39
fuente
0

La práctica común es usar cualquier algoritmo hash, como SHA-2 en el cliente. Para un poco más de seguridad, se puede usar un hash lento como PBKDF2, bcrypt o scrypt. Un hash lento es un hash diseñado para requerir una gran cantidad de poder computacional, lo que hace que los ataques de fuerza bruta con listas de contraseñas comunes sean más difíciles.

La ventaja de seguridad real de los hashes lentos no es grande, sin embargo, porque los usuarios seleccionan las contraseñas de una lista bastante pequeña de contraseñas comunes. En mi propio análisis, cerca de un millón de contraseñas (20 bits) recuperan el 50% de las cuentas ( enlace ). Tan solo 1000 contraseñas recuperan una fracción significativa de las cuentas (6.1%).

Es imposible hacer un hash con una cantidad tan pequeña de entropía que se convierta en un obstáculo importante para un atacante.

    
respondido por el Jeff-Inventor ChromeOS 25.08.2014 - 09:10
fuente
0

No está claro qué lenguaje está utilizando, pero en el PHP más reciente, esto lo hace fácil al usar una función hash incorporada que puede dar cuenta del mejor y más reciente cifrado. Hay una función de verificación para probar contra el hash. También hay una función de rehash que puede dar cuenta de cambios futuros, de modo que los hashes antiguos pueden actualizarse y aún pueden verificarse. Dada la implementación adecuada, esto debería ocuparse de la mayoría de los problemas que podría enfrentar. Sin embargo, como señala Jeff-Inventor ChromeOS, la mayoría de los usos de un hash no requieren mucho más que un algoritmo más simple. Depende de sus necesidades y de cuánto esté dispuesto a sacrificar la seguridad en el tiempo / poder de procesamiento.

    
respondido por el Rob 16.10.2015 - 21:27
fuente

Lea otras preguntas en las etiquetas