Tôi đang sử dụng .net port of libsodium. Chức năng thế hệ băm có hai dạng, một là chấp nhận mảng byte và một trong đó chấp nhận chuỗi:Chuyển đổi mảng byte thành chuỗi và sau đó lại tạo ra các kết quả khác nhau
public static byte[] ArgonHashBinary(string password, string salt, long opsLimit, int memLimit, long outputLength = ARGON_SALTBYTES)
public static byte[] ArgonHashBinary(byte[] password, byte[] salt, long opsLimit, int memLimit, long outputLength = ARGON_SALTBYTES)
gì tôi đang gặp một vấn đề với cả hai hình thức là sản xuất các hash tương tự khi các giá trị đầu vào là giống hệt nhau.
var saltAsBytes = PasswordHash.ArgonGenerateSalt();
var saltAsString = Encoding.UTF8.GetString(saltAsBytes);
var tmp = Encoding.UTF8.GetBytes(saltAsString);
var hash1 = PasswordHash.ArgonHashBinary(password, saltAsString, 6, 134217728, 16);
var hash2 = PasswordHash.ArgonHashBinary(Encoding.UTF8.GetBytes(password), saltAsBytes, 6, 134217728, 16);
Bất kỳ thứ gì có "PasswordHash". là libsodium chứ không phải mã của tôi.
Từ mã ở trên khi tôi chuyển đổi từ chuỗi và sau đó quay lại mảng byte mảng byte. Mảng mảng byte luôn có độ dài khác nhau. ArgonGenerateSalt()
tạo ra một mảng byte với chiều dài là 16. Khi tôi chuyển đổi nó trở lại từ một chuỗi trên của nó thường ~ 30 (khác nhau mỗi lần vì các muối khác nhau được sản xuất).
Tại sao tôi chuyển sang UTF8? Bởi vì đó là những gì họ đang làm trong nội bộ: https://github.com/adamcaudill/libsodium-net/blob/master/libsodium-net/PasswordHash.cs
public static byte[] ArgonHashBinary(string password, string salt, StrengthArgon limit = StrengthArgon.Interactive, long outputLength = ARGON_SALTBYTES)
{
return ArgonHashBinary(Encoding.UTF8.GetBytes(password), Encoding.UTF8.GetBytes(salt), limit, outputLength);
}
Khi tôi chuyển đổi các muối vào một chuỗi UTF8 chức năng băm sẽ thất bại bởi vì họ đang kiểm tra độ dài của mảng byte để đảm bảo 16 byte của nó. Nếu tôi chuyển đổi nó thành một chuỗi ASCII nó hoạt động nhưng tạo ra một hash khác nhau (được mong đợi).
Để làm rõ phần băm trong mã này không phải là vấn đề. Tìm ra lý do tại sao tmp
khác nhau sau đó saltAsBytes
là chìa khóa.
Bạn đã đơn bước mã trong 'PasswordHash 'để xem nơi mọi thứ đang đi khác nhau? –
@JimMischel Phần nào?Phần quan trọng nhất ở trên là khi tôi tạo ra muối và sau đó bí mật nó thành một chuỗi và sau đó trở lại một mảng byte. Phần lớn mã đó là của riêng tôi. Chỉ có điều thư viện đang làm là tạo ra muối ngẫu nhiên. Điều gì liên quan nhiều nhất đến biến 'tmp' không giống như 'saltAsBytes'. Vì vậy, tôi không nghĩ rằng điều này có bất cứ điều gì để làm với phần băm. Một khi tôi tìm ra lý do tại sao điều đó xảy ra phần băm có thể sẽ hoạt động. – coding4fun
Bạn có chắc chắn mảng byte chỉ chứa các mã UTF-8 hợp lệ không? Tôi không chắc chắn cách GetBytes() hoạt động, khi mảng chứa các điểm mã không hợp lệ. –