2014-09-09 15 views
5

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ỳ?

+0

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? –

+0

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

+0

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

Trả lời

7

cuối cùng tôi đã tìm thấy câu trả lời đúng ở đây: https://gist.github.com/PalmerEk/1191651 (với rất ít thay đổi từ 'UCS2' thành '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'); 
} 
+1

Lưu ý rằng mã của bạn sử dụng 'ucs2' và không phải 'utf16le' (hoặc 'utf-16' hoặc 'utf-16le' hoặc 'utf16', tôi không biết mã nào là chính xác). Các cựu không hỗ trợ bổ sung mã điểm, trong khi sau này không. –

+0

Điểm tốt tôi đã cập nhật câu trả lời. Cảm ơn. – user606521

+0

Cảm ơn chúa, bạn cứu tôi! – osrpt

1

Thay đổi bảng mã của bộ đệm để utf16le công trình cho cả hai ví dụ bạn cung cấp ở đây.

này được xác nhận bởi những điều sau StackOverflow Answer.

này là tiếp tục ghi nhận tại the relevant .Net Framework documentation

+0

Tôi vẫn không thể làm cho nó hoạt động - nơi chính xác (và làm thế nào) tôi nên thay đổi mã hóa?Tôi đã thử thay đổi 'utf8' thành 'utf16le' nhưng nó vẫn không hoạt động. Bạn có thể cung cấp một số đoạn mã trong nút làm thế nào để sửa đổi mã node.js để có được kết quả tương tự như từ mã C#? – user606521

+0

Tôi sẽ cung cấp cho bạn tiền thưởng trong vài giờ vì bạn trả lời, mặc dù không hoàn thành, đã giúp tôi tìm ra giải pháp. Cảm ơn. – user606521

3

có một mô-đun nodejs mà làm tất cả các phép thuật cho bạn. Không có chức năng trên stackoverflow làm việc trong trường hợp của tôi, nhưng mô-đun này hoạt động:

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); 
Các vấn đề liên quan