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?