使用SHA256和.NET/Node.js哈希密码

19

我在我的数据库中存储由.NET生成的用户密码的SHA256哈希,我需要能够使用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(使用加密):

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

//d7I986+YD1zS6Wz2XAcDv2K8yw3xIVUp7u/OZiDzhSY=

我找到了这个,但是无法弄清如何实现他的解决方案。

3个回答

32

修改:在C#中您使用的是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=

1
谢谢,这个很好用!我在你回答时正在添加代码。 :) - davey555
2
好的,所以上面的解决方案将.NET实现更改为与JS相匹配(即UTF-8)。我们有一个类似的情况,只是我们存储了使用Unicode编码(UTF-16)计算得到的散列值。那么问题是如何改变JS的实现以适应这种情况? - Jaans
非常好!感谢您的帮助! - HarshMarshmallow

1

如果您正在使用.NET Framework中的System.Web.Security中的内置SqlMembershipProvider类,则在生成哈希时,哈希会包含盐值以及密码材料。仅在node.js中对密码进行哈希处理将永远不会产生与数据库中哈希相同的结果。

请参见Microsoft ASP.NET 2.0 Providers: Introduction,获取提供程序的.NET源代码的链接,以便您可以查看如何应用盐值。

如果需要更多帮助,请包含您的代码。


0

我创建了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');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接