如何检查node.js中的ASP.NET密码哈希

首先我使用SHA256和.NET / Node.js来读取这个散列密码 ,它并没有帮助我。

我必须validation在node.js环境中在ASP.NET中创build的密码哈希值。 我被告知使用这个algorithm生成密码: 什么是ASP.NET成员资格使用的默认散列algorithm? 。

我有密码哈希和盐示例(第一行是密码,第二行是盐):

"Password": "jj/rf7OxXM263rPgvLan4M6Is7o=", "PasswordSalt": "/Eju9rmaJp03e3+z1v5s+A==", 

我知道哈希algorithm是SHA1 ,我知道上面的哈希是为inputtest123生成的。 不过,我不能重现哈希algorithm来获得相同的哈希input。 我试过的:

 Password = "jj/rf7OxXM263rPgvLan4M6Is7o=" PasswordSalt = "/Eju9rmaJp03e3+z1v5s+A==" crypto = require("crypto") sha1 = crypto.createHash("sha1") PasswordSalt = new Buffer(PasswordSalt, 'base64').toString('utf8') sha1.update(PasswordSalt+"test123", "utf8") result = sha1.digest("base64") console.log(Password) console.log(result) 

结果是:

 jj/rf7OxXM263rPgvLan4M6Is7o= xIjxRod4+HVYzlHZ9xomGGGY6d8= 

我能够得到工作的C#algorithm:

 using System.IO; using System; using System.Text; using System.Security.Cryptography; class Program { static string EncodePassword(string pass, string salt) { byte[] bytes = Encoding.Unicode.GetBytes(pass); byte[] src = Convert.FromBase64String(salt); byte[] dst = new byte[src.Length + bytes.Length]; Buffer.BlockCopy(src, 0, dst, 0, src.Length); Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); byte[] inArray = algorithm.ComputeHash(dst); return Convert.ToBase64String(inArray); } static void Main() { string pass = "test123"; string salt = "/Eju9rmaJp03e3+z1v5s+A=="; string hash = Program.EncodePassword(pass,salt); Console.WriteLine(hash); // outputs jj/rf7OxXM263rPgvLan4M6Is7o= } } 

所以现在只需要将这个algorithm移植到node.js. 问题是,C#不知何故神奇地操作字节,我不知道如何在节点中做到这一点。 考虑下面的代码(它不使用任何盐 – 它只是从密码创buildbase64 sha1:

 crypto = require("crypto") pass = 'test123' sha1 = crypto.createHash("sha1") buf = new Buffer( pass, 'utf8') sha1.update(buf) result = sha1.digest("base64") console.log(result) // outputs cojt0Pw//L6ToM8G41aOKFIWh7w= 

而在C#

  using System.Text; using System.Security.Cryptography; string pass = "test123"; byte[] bytes = Encoding.Unicode.GetBytes(pass); HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); byte[] inArray = algorithm.ComputeHash(bytes); string hash = Convert.ToBase64String(inArray); Console.WriteLine(hash); // outputs Oc/baVMs/zM28IqDqsQlJPQc1uk= 

我需要node.js中的代码,它将返回与c#中的代码相同的值。 有任何想法吗?

我终于在这里find了正确的答案: https : //gist.github.com/PalmerEk/1191651 (从“ucs2”到“utf16le”几乎没有变化):

 function dotnet_membership_password_hash(pass, salt) { var bytes = new Buffer(pass || '', 'utf16le'); var src = new Buffer(salt || '', 'base64'); var dst = new Buffer(src.length + bytes.length); src.copy(dst, 0, 0, src.length); bytes.copy(dst, src.length, 0, bytes.length); return crypto.createHash('sha1').update(dst).digest('base64'); } 

有一个nodejs模块,它为你做了所有的魔法。 在我的情况下,没有对stackoverflow的function工作,但这个模块的工作原理:

https://www.npmjs.com/package/aspnet-identity-pw

  var passwordHasher = require('aspnet-identity-pw'); var hashedPassword = passwordHasher.hashPassword('SomePassword'); var isValid = passwordHasher.validatePassword('SomePassword', hashedPassword); 

将缓冲区的编码更改为utf16le适用于您在此处提供的两个示例。

这是由以下StackOverflow答案确认。

在相关的.Net Framework文档中进一步logging了这一点