Tôi cần phải tạo một băm mật khẩu PBKDF2-SHA256, nhưng đang gặp một số sự cố.Cách tạo băm mật khẩu PBKDF2-SHA256 trong C#/Bouncy Castle
Tôi đã tải xuống bản thử nghiệm Bouncy Castle, nhưng có một chút khó khăn khi tìm thấy những gì tôi đang tìm kiếm trong Bài kiểm tra đơn vị.
Tìm thấy một số mã mẫu here, nhưng điều này chỉ thực hiện SHA1. Mã khóa chính là:
/// <summary>
/// Computes the PBKDF2-SHA1 hash of a password.
/// </summary>
/// <param name="password">The password to hash.</param>
/// <param name="salt">The salt.</param>
/// <param name="iterations">The PBKDF2 iteration count.</param>
/// <param name="outputBytes">The length of the hash to generate, in bytes.</param>
/// <returns>A hash of the password.</returns>
private static byte[] PBKDF2(string password, byte[] salt, int iterations, int outputBytes)
{
var pdb = new Pkcs5S2ParametersGenerator();
pdb.Init(PbeParametersGenerator.Pkcs5PasswordToBytes(password.ToCharArray()), salt,
iterations);
var key = (KeyParameter)pdb.GenerateDerivedMacParameters(outputBytes * 8);
return key.GetKey();
}
Tôi cần thay đổi điều này từ SHA1 thành SHA256.
Từ tài liệu Java và this post, có vẻ như sau đây là có thể, nhưng không có quá tải trên hàm tạo trong thư viện C#.
var pdb = new Pkcs5S2ParametersGenerator(new Sha256Derived());
Tìm another article trên stack overflow, tôi nghĩ sau đây có thể có thể, nhưng các thuật toán băm SHA không nằm trong danh sách tra cứu, vì vậy sau đây sẽ không hoạt động.
var bcparam = (KeyParameter)pdb.GenerateDerivedParameters("sha256", outputBytes * 8);
Tôi cần làm gì để làm việc này?
Lưu ý: Nếu bạn đọc và không biết làm thế nào trong Lâu đài Bouncy, nhưng bạn biết cách khác, tôi vẫn đánh giá cao sự giúp đỡ của bạn.
Nguồn cho Pkcs5S2ParametersGenerator() có sẵn để bạn có thể sửa đổi. Tại sao không làm điều đó? –
@JamesKPolk - Nhận xét hợp lệ. Lý do là: A. Bởi vì tôi không hiểu rõ điều đó và B. Tôi tin rằng việc tự xoay sở của mình theo bất kỳ cách nào được coi là không nghiêm trọng khi nói đến mã hóa. Tuy nhiên có lẽ vì điều này chỉ là giả mạo với các thiết lập nó có thể là ok. Tôi giả định có phải là một cách, nhưng có lẽ C# BouncyCastle là tụt lại phía sau phiên bản java và nó chỉ không được bao gồm? Nếu có thực sự không phải là một cách để làm điều này trong C# thì tôi có thể thử một yêu cầu kéo và cập nhật mã, dựa trên phiên bản Java. Sẽ thực sự thay vì có một cái gì đó có sẵn mà tôi chỉ có thể sử dụng. – HockeyJ