Хеширование пароля с использованием SHA256 и .NET/Node.js
Im Хранение SHA256 хэшей паролей пользователей в моей базе данных, созданных .NET, и мне нужно проверить их с помощью Node.js. Единственная проблема заключается в том, что .NET и Node.js создают разные хэши для одного и того же пароля.
Password: ThisPassword
.NET:
var ue = new UnicodeEncoding();
var byteSourceText = ue.GetBytes("ThisPassword");
var byteHash = new System.Security.Cryptography.SHA256Managed().ComputeHash(byteSourceText);
return Convert.ToBase64String(byteHash);
//Tlwxyd7HIQhXkN6DrWJtmB9Ag2fz84P/QgMtbi9XS6Q=
Node.js(с использованием Crypto):
var crypto = require('crypto');
return crypto.createHash('sha256').update('ThisPassword').digest('base64')
//d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=
Я нашел этот, но не смог понять, как реализовать его решение.
Ответы
Ответ 1
Изменить: вы используете UTF-16 в С#, вы должны использовать ту же кодировку на обоих языках:
Node.js
var crypto = require("crypto");
var sha256 = crypto.createHash("sha256");
sha256.update("ThisPassword", "utf8");//utf8 here
var result = sha256.digest("base64");
console.log(result); //d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=
С#:
SHA256 sha256 = SHA256Managed.Create(); //utf8 here as well
byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes("ThisPassword"));
string result = Convert.ToBase64String(bytes);
Console.WriteLine(result); //d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=
Ответ 2
Если вы используете встроенный класс SqlMembershipProvider класса .NET Framework из System.Web.Security, хеш включает значение соли, а также материал пароля при его создании. Простое хеширование только пароля в node.js никогда не приведет к такому же результату, как хэш в базе данных.
См. Поставщики Microsoft ASP.NET 2.0: введение для ссылки на исходный код .NET для провайдера, который позволит вам увидеть, как соль значение применяется.
Вам нужно указать свой код, если вам нужна дополнительная помощь.
Ответ 3
Я создал модуль node pbkdf2 (источник https://github.com/fundon/pbkdf2)
Требуется node >= 0.11.11
var pbkdf2 = require('pbkdf2');
var p = 'password';
var s = pbkdf2.generateSaltSync(32);
var pwd = pbkdf2.hashSync(p, s, 1, 20, 'sha256');
var bool = pbkdf2.compareSync(pwd, p, s, 1, 20, 'sha256');