2010-06-17 31 views

Trả lời

8

Chúng tôi đã có một cuộc thảo luận lớn trong một thời gian trước đây về thực tiễn tốt nhất khi ướp muối mật khẩu, bạn có thể tìm thấy một số ý tưởng tuyệt vời đó:

Salting Your Password: Best Practices?

tôi đã tìm thấy rằng một trong những đơn giản nhất, trong khi vẫn khá bảo mật, là sử dụng GUID làm muối của bạn. Đó là ngẫu nhiên và đủ dài. Nó hoạt động tốt nhất nếu bạn bao gồm định dạng chuỗi của GUID (ký tự '{' và '-'), nhưng bạn không phải làm như vậy.

Hãy nhớ rằng muối phải là duy nhất cho mỗi mục được muối và để an toàn nhất, bạn nên sử dụng trình tạo số ngẫu nhiên an toàn mã hóa. Cũng nên nhớ rằng bạn phải lưu trữ muối của mình cùng với mật khẩu, hoặc bạn sẽ không thể kiểm tra phiên bản chữ thô so với phiên bản băm! Bạn có thể lưu trữ muối không được mã hóa nếu bạn muốn; Tôi thường đặt nó vào một trường trên cùng một bảng với mật khẩu. Mục đích của muối không phải là để ẩn, đó là làm cho bàn cầu vồng khó khăn (hy vọng là không thể) để tính toán một cách kịp thời.

Dưới đây là một đoạn nhanh chóng mà sẽ làm việc trong C#:

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
byte[] buffer = new byte[1024]; 

rng.GetBytes(buffer); 
string salt = BitConverter.ToString(buffer); 
var saltedPassword = password + salt; 

hoặc ...

var salt = Guid.NewGuid().ToString(); 
var saltedPassword = password + salt; 
+3

Nếu bạn tạo ra các muối ngẫu nhiên, hãy nhớ giữ chúng trong khi bạn cần chúng để giải mã trên đường ra. –

+0

@Adam: điểm tốt. Ban đầu tôi đã có một câu với hiệu ứng đó nhưng rõ ràng đã chỉnh sửa nó. Tôi sẽ đưa nó trở lại. – Randolpho

+1

Đừng lo lắng, +1 cho một lời giải thích tốt :) –

2

Đây là nice articleanother one (được điều chỉnh cho phù hợp hơn với các ứng dụng ASP.NET).

+1

Các bài viết thứ hai này là tốt hơn, vì nó cho phép kích thước muối tùy ý. Người đầu tiên đề xuất muối 4-byte; chắc chắn cách nhỏ. Các muối nên dài. Tôi không chỉ trích bạn, chỉ cần đặt điều này ở đây cho hậu thế. :) – Randolpho

0

Không có ma thuật, một muối đơn giản là một số văn bản ngẫu nhiên được thêm vào mật khẩu để đánh bại các cuộc tấn công từ điển - tạo nên sự ngu ngốc của riêng bạn.

0

Hãy xem qua các chức năng hmac như hmacdm5, hmacsha1 hoặc hmacsha256.
Nhìn vào không gian tên System.Security.Cryptography.

+0

@ downvoter: Tôi muốn nghe về vấn đề này ... thx – tanascius

+0

Tôi cũng thế. : S Tại sao điều này lại bị giảm giá? –

+0

Có thể bởi vì nó không có nhiều để làm với muối trực tiếp? Không chắc... –

4

Tôi cho rằng bạn đang yêu cầu tên người dùng cùng với mật khẩu?

Trong một số tên người dùng hệ thống được sử dụng làm muối. (Và tôi nghĩ rằng nó là OK để làm điều đó.) Nếu không, bạn sẽ cần phải có muối của bạn được lưu trữ ở đâu đó và lấy nó trước khi băm (trong trường hợp muối ngẫu nhiên tạo ra) hoặc có một thuật toán sẽ trả về cùng một muối cho cùng một người dùng (và nó không phải là tốt hơn mà chỉ cần sử dụng một tên người dùng đồng bằng).

Cá nhân sử dụng đoạn mã sau:

byte[] GetSaltedPasswordHash(string username, string password) 
{ 
    byte[] pwdBytes = Encoding.UTF8.GetBytes(password); 
    // byte[] salt = BitConverter.GetBytes(userId); 
    byte[] salt = Encoding.UTF8.GetBytes(username); 
    byte[] saltedPassword = new byte[pwdBytes.Length + salt.Length]; 

    Buffer.BlockCopy(pwdBytes, 0, saltedPassword, 0, pwdBytes.Length); 
    Buffer.BlockCopy(salt, 0, saltedPassword, pwdBytes.Length, salt.Length); 

    SHA1 sha = SHA1.Create(); 

    return sha.ComputeHash(saltedPassword); 
} 
Các vấn đề liên quan