Trước hết tôi đọc số này Hashing a password using SHA256 and .NET/Node.js và nó không giúp tôi.Cách kiểm tra hàm băm mật khẩu ASP.NET trong node.js
Tôi phải xác minh các băm mật khẩu được tạo trong ASP.NET trong môi trường node.js. Tôi đã nói rằng mật khẩu được tạo ra bằng cách sử dụng thuật toán này: What is default hash algorithm that ASP.NET membership uses?.
Tôi có băm dụ mật khẩu và muối (dòng đầu tiên là mật khẩu và dòng thứ hai là muối):
"Password": "jj/rf7OxXM263rPgvLan4M6Is7o=",
"PasswordSalt": "/Eju9rmaJp03e3+z1v5s+A==",
Tôi biết rằng thuật toán băm là SHA1
và tôi biết rằng trên hash được tạo ra cho đầu vào test123
. Tuy nhiên tôi không thể tái tạo thuật toán băm để có được cùng một băm cho đầu vào này. Những gì tôi đã cố gắng:
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)
Kết quả là:
jj/rf7OxXM263rPgvLan4M6Is7o=
xIjxRod4+HVYzlHZ9xomGGGY6d8=
tôi đã có thể để có được làm việc C# thuật toán:
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=
}
}
Vì vậy, bây giờ nó chỉ là một vấn đề của porting này thuật toán cho node.js. Vấn đề là C# bằng cách nào đó kỳ diệu hoạt động trên byte và tôi không biết làm thế nào để làm điều đó trong nút. Hãy xem xét đoạn mã sau (nó không sử dụng bất kỳ muối - nó chỉ tạo ra base64 sha1 từ mật khẩu:
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=
Và trong 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=
tôi cần mã trong Node.js rằng sẽ trở lại cùng một giá trị như mã trong C#. ý tưởng Bất kỳ?
Bạn có chắc chắn đây là cách muối đang được sử dụng trong nền tảng .NET, nó có vẻ như một cách ngây thơ. Bạn có chắc đó không phải là HMAC không? Ngoài ra, bạn có chắc chắn các byte bạn đang thêm với + "test123" là những gì bạn muốn và không phải UTF-16 hoặc bất kỳ v8 đang sử dụng dưới mui xe? –
Tôi thực sự không biết - hiện tại DB (chúng tôi đang di chuyển từ DB này thực sự) duy trì gửi cho tôi chỉ liên kết này http://stackoverflow.com/questions/1137368/what-is-default-hash-algorithm-that-asp -net-membership-use? answerertab = active # tab-top - bất kỳ ý tưởng nào? – user606521
Tôi đã cập nhật câu hỏi - Tôi đã cung cấp mã C# hoạt động mà tôi cần để chuyển sang node.js. – user606521