Error de hash de contraseña

3

Descargo de responsabilidad: sé sobre los peligros de rodar su propia autenticación, este ejemplo está destinado a ser usado en una demostración para varios métodos de hashing.

Escribí esta función Node.js para ejecutar el lado del servidor para reforzar por qué no deberíamos rodar la nuestra sino usar una biblioteca existente (Bcrypt principalmente), pero puedo deshacer mi propio argumento, ya que no puedo ver cómo esto se puede romper fácilmente. .

La única forma que puedo imaginar es si el atacante puede calcular la sal fija (pimienta), tal vez obteniendo un hash pw conocido, extrayendo la sal aleatoria (necesitarían saber la longitud) y construyendo sus propias tablas de arco iris. Para intentar romper la sal fija (esto es muy largo y tiene una alta entropía).

function checkPw(pw, fullhash) {
    //random one time salt is first 12 chars
    var salt = fullhash.substr(0,12);

    //hashing the full pw, our random salt, the pw and a global fixed salt
    var hashpart = crypto.createHash('sha256').update(salt + pw + process.env.SALT).digest('hex');

    return (hashpart === fullhash.substr(12));
};

Mi pregunta es ¿dónde está la falla aquí? Debe haber algo obvio que me estoy perdiendo?

    
pregunta Trickycm 14.09.2017 - 14:11
fuente

3 respuestas

3

Hay varios defectos:

Primero, no veo por qué querría "reforzar el uso de la biblioteca existente (principalmente Bcrypt)". O utiliza un algoritmo de hashing de contraseña sólido (BCrypt es bueno) o no. Si no lo hace, no debe intentar "reforzarlo", sino cambiar a un algoritmo sólido en su lugar.

Segundo: Su código es, como usted dice, Javascript. Javascript implica hashing del lado del cliente. El hashing del lado del cliente es de humor, hay varias respuestas aquí en security.SE que explican por qué esto es así. el caso. (Si solo elige utilizar Javascript para fines de demostración, ignore este punto).

Tercero: tu 'sal fija' generalmente se conoce como ' pepper '. Un pimiento puede agregar seguridad en algunos casos muy específicos. Un pimiento funciona por ser un secreto. Como resultado, un pimiento no tiene ningún beneficio si se usa para el hashing del lado del cliente.

Cuarto: SHA256 es un hash de propósito general. Está diseñado para ser rápido. Rápido es exactamente lo que no desea para el hashing de contraseñas.

Quinto: tu operador de comparación final es vulnerable a los ataques de tiempo.

Pero todo se reduce al primer punto: elija un algoritmo de hashing de contraseña sólido (BCrypt) y no intente mejorarlo.

    
respondido por el Jacco 14.09.2017 - 18:43
fuente
2

Si alguien roba su base de datos, puede apostar que también puede robar el código fuente. Así sabrán el esquema de hash, el tamaño de la sal, la posición de la sal. Con esta información, se puede usar un ataque de diccionario contra sus datos.

La principal debilidad de esta función es tiempo . Puede construir plataformas relativamente baratas a miles de millones de combinaciones de fuerza bruta por segundo con un par de GPU. Usando bcrypt puedes definir cuantas rondas de hash emplearás. Un bcrypt con 1000 rondas es aproximadamente 1000 veces más caro de crackear.

    
respondido por el ThoriumBR 14.09.2017 - 14:43
fuente
-1

Como dijo @ThoriumBR, si un cracker quiere romper el hash, primero debe piratear el sistema. Cuando un atacante piratea un sistema, podemos asumir que obtiene su control total, sin importar la base de datos que contiene toda la contraseña, o el sistema que realiza la acción de hash. Dado que el atacante obtiene toda la información que necesita, solo necesita iniciar un ataque de diccionario contra el conjunto hash. Si agrega un sal fijo parece que aumenta la seguridad, pero no lo es, porque el atacante simplemente puede extraer el sal fijo del servidor. Además, su método de hash tiene fallas, ya que solo lo hace 1 vez, y cada computadora puede calcularlo muy rápido en términos de un solo cálculo. Debería considerar la función KDF como PBKDF2, en lugar de agregar una sal fija.

    
respondido por el Hartman 14.09.2017 - 15:59
fuente

Lea otras preguntas en las etiquetas