首先,我读了这篇使用SHA256和.NET /Node.js的哈希密码,它对我没有帮助。
我必须验证在node.js环境中在ASP.NET中创建的密码哈希。
我有示例密码哈希和盐(第一行是密码,第二行是盐):
"Password": "jj/rf7OxXM263rPgvLan4M6Is7o=", "PasswordSalt": "/Eju9rmaJp03e3+z1v5s+A==",
我知道哈希算法是,SHA1而且我知道上面的哈希是为输入生成的test123。但是,我无法重现哈希算法以为此输入获得相同的哈希。我试过的
SHA1
test123
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#算法:
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= } }
因此,现在只需要将此算法移植到node.js即可。问题在于,c#以某种方式神奇地对字节进行了操作,而我不知道如何在节点中进行操作。考虑以下代码(它不使用任何盐-它仅通过密码创建base64 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#中的代码相同的值。有任何想法吗?
我终于在这里找到了正确的答案: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'); }