2009-08-19 35 views
18

Bạn có thể vui lòng cho tôi một số thuật toán dễ dàng để băm mật khẩu người dùng bằng MD5 không, nhưng với muối để tăng độ tin cậy.Băm MD5 với muối để giữ mật khẩu trong DB trong C#

Bây giờ tôi có một này:

private static string GenerateHash(string value) 
{ 
    var data = System.Text.Encoding.ASCII.GetBytes(value); 
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data); 
    return Convert.ToBase64String(data); 
} 
+5

Tại sao lại sử dụng băm bị hỏng như MD5? Ở mức tối thiểu sử dụng một cái gì đó giống như SHA-256. –

+6

Vâng, tại sao KHÔNG sử dụng MD5? Sử dụng một muối hợp lý giảm nhẹ lỗ hổng do MD5 thiếu khả năng chống va chạm, phải không? –

+1

@Greg, bạn có thể vui lòng cung cấp một số ví dụ về việc sử dụng, với muối nếu có không? – abatishchev

Trả lời

40

Bạn có thể sử dụng lớp HMACMD5:

var hmacMD5 = new HMACMD5(salt); 
var saltedHash = hmacMD5.ComputeHash(password); 

trình với SHA-1, SHA256, SHA384, SHA512 và RIPEMD160 cũng như:

var hmacSHA1 = new HMACSHA1(salt); 
var saltedHash = hmacSHA1.ComputeHash(password); 

Cả saltpassword được kỳ vọng như mảng byte .

Nếu bạn có các chuỗi bạn sẽ phải chuyển đổi chúng sang byte đầu tiên:

var salt = System.Text.Encoding.UTF8.GetBytes("my salt"); 
var password = System.Text.Encoding.UTF8.GetBytes("my password"); 
+1

http://msdn.microsoft.com/en-us/library/system.security.cryptography.hmacsha1.hmacsha1.aspx Nhà xây dựng HMACSHA1 không chấp nhận muối nhưng một khóa là tham số đơn – abatishchev

+4

Một HMAC thường được sử dụng để lấy khóa băm của một tin nhắn. Nếu bạn thay thế khóa bằng một muối và thông báo bằng mật khẩu của mình, bạn có thể sử dụng HMAC để lấy hàm băm muối của mật khẩu. – dtb

+0

Có cách nào để giải mã mật khẩu muối không? – Sana

12

Dưới đây là một sample. Nó xử lý MD5, SHA1, SHA256, SHA384 và SHA512.

+0

đáng tiếc, câu trả lời này không phải là trung tâm được coi là mã được chấp nhận. nó rất hữu ích và nhanh chóng để triển khai. cảm ơn! – zanlok

1

Microsoft đã thực hiện tác phẩm này với bạn, nhưng phải mất một chút đào. Cài đặt Tiện ích mở rộng dịch vụ web 3.0 và xem chức năng Microsoft.Web.Services3.Security.Tokens.UsernameToken.ComputePasswordDigest với Trình phản xạ.

Tôi muốn đăng mã nguồn vào chức năng đó ở đây, nhưng tôi không chắc liệu nó có hợp pháp để làm điều đó hay không. Nếu bất cứ ai có thể trấn an tôi thì tôi sẽ làm như vậy.

+3

Tôi nghi ngờ rằng tính hợp pháp phụ thuộc rất nhiều vào vị trí của bạn. Ở một số khu vực pháp lý, việc bạn thậm chí xem xét mã đã bị giải mã là bất hợp pháp, hãy để một mình đăng nó để người khác xem xét! – LukeH

+2

Mặc dù với Visual Studio 2008 có thể xem mã nguồn cho .net khi gỡ lỗi, miễn là bạn đồng ý với MS 'T & Cs cho điều đó. –

3

Ngoài các lớp HMACSHA1 đề cập ở trên, nếu bạn chỉ cần một băm ướp muối nhanh chóng, sau đó bạn đã 95% số đường có:

private static string GenerateHash(string value, string salt) 
{ 
    byte[] data = System.Text.Encoding.ASCII.GetBytes(salt + value); 
    data = System.Security.Cryptography.MD5.Create().ComputeHash(data); 
    return Convert.ToBase64String(data); 
} 

Bí quyết thực được lưu trữ trong một muối vị trí an toàn, chẳng hạn như machine.config của bạn.

+0

Dấu thời gian có thể là muối tốt không? hoặc khám phá thực tế như vậy sẽ thỏa hiệp toàn bộ thuật toán? – abatishchev

+0

Dấu thời gian sẽ không hoạt động vì khi bạn xác thực hàm băm với đầu vào mới, thời gian sẽ khác. – Fantius

+0

Trừ khi bạn đang lưu trữ dấu thời gian cùng với thông báo, trong trường hợp đó nó sẽ hoạt động nhưng sẽ không an toàn lắm. – Fantius

Các vấn đề liên quan