Хэширование пароля с использованием SHA256 и .NET/Node.js

Я храню хэши паролей пользователей SHA256 в своей базе данных, сгенерированной .NET, и мне нужно иметь возможность проверять их с помощью Node.js. Единственная проблема заключается в том, что .NET и Node.js создают разные хэши для одного и того же пароля.

Password: ThisPassword  

.СЕТЬ:

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 (с использованием криптографии):

var crypto = require('crypto');
return crypto.createHash('sha256').update('ThisPassword').digest('base64')

//d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=

Я нашел это, но не смог понять как реализовать его решение.


person davey555    schedule 04.12.2012    source источник


Ответы (3)


Изменить: вы используете 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=

C#:

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=
person Esailija    schedule 05.12.2012
comment
Спасибо, это сработало отлично! Я добавлял код, когда вы ответили. :) - person davey555; 05.12.2012
comment
Итак, приведенное выше решение изменяет реализацию .NET, чтобы она соответствовала реализации JS (т.е. UTF-8). У нас похожая ситуация, за исключением того, что мы сохранили хэши, рассчитанные в кодировке Unicode (UTF-16). Итак, вопрос в том, как нам изменить реализацию JS, чтобы она соответствовала? - person Jaans; 31.07.2013
comment
Работает отлично! Спасибо за помощь! - person HarshMarshmallow; 25.03.2015

Если вы используете встроенный в .NET Framework класс SqlMembershipProvider из System.Web.Security, хэш включает в себя солт-значение, а также материал пароля при его создании. Простое хеширование пароля в вашем node.js никогда не даст того же результата, что и хэш в базе данных.

Ссылку на .NET см. в разделе Поставщики Microsoft ASP.NET 2.0: введение. исходный код поставщика, который позволит вам увидеть, как применяется значение соли.

Вам нужно включить свой код, если вам нужна дополнительная помощь.

person JamieSee    schedule 05.12.2012

Я создал модуль узла pbkdf2 (источник https://github.com/fundon/pbkdf2)

Требуемый узел >= 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');
person fundon    schedule 18.02.2014