2009-06-01 41 views
5

Trả trước, tôi muốn thú nhận là một người mới hoàn thành về mật mã và bảo mật mật khẩu. Tôi đang cố gắng để lưu trữ mật khẩu trong một cơ sở dữ liệu được babysat bởi ruby. sự hiểu biết của tôi là mật khẩu chữ thô nên được nối thêm vào một "muối" ngẫu nhiên và rằng toàn bộ cụm từ nên được băm bằng một số thuật toán băm như:làm việc với mật khẩu băm trong ruby ​​

Digest::SHA1.hexdigest(salt_plus_plainpassword) 

Khi chuỗi được lưu trữ trong cơ sở dữ liệu, làm thế nào để có được nó một lần nữa để xác minh rằng những gì người dùng đã nhập là chính xác nếu có một muối ngẫu nhiên chưa biết được nối vào nó?

Trả lời

6

Cách tốt nhất để làm điều đó là lưu trữ muối là một cho mỗi người dùng và được tạo dựa trên Thời gian tại thời điểm họ đã thực hiện.

Đúng là một khi một người có quyền truy cập vào cơ sở dữ liệu của bạn, họ có thể thấy muối cho người dùng, nhưng nếu điều này xảy ra, bạn có những điều lớn hơn phải lo lắng.

Cách bạn kiểm tra mật khẩu của người dùng của bạn là bạn hãy nhập văn bản rõ ràng của họ và hầm mộ nó với muối và sau đó so sánh crypted_passwords, nếu họ khớp chúng được chứng thực. Tôi không tin rằng việc lưu trữ muối là một vấn đề vì bạn sẽ cần nó. Nếu bạn đang lo lắng về các cuộc tấn công SQL injection, bạn nên tắt bảo mật ứng dụng của mình hơn là không lưu trữ thông tin bạn cần, trong trường hợp này mỗi người dùng đều có muối.

+0

Cũng được nói. –

+2

Để xây dựng trên đó: lưu trữ muối không phải là một vấn đề vì mục đích duy nhất của nó là để cứu bạn khỏi các cuộc tấn công vào các bảng cầu vồng. Như băm là không thể đảo ngược nhưng có thể dự đoán được, những kẻ tấn công có thể tìm ra mật khẩu từ các băm không bẻ khóa bằng cách chỉ nhìn vào các băm được tính toán trước của các mật khẩu thông thường. Để nói lại rằng: đoán và liệt kê kết quả của sha1 ("hello") [1] rất dễ, đoán kết quả của sha1 ("hello" + salt()) thực sự khó. [1] đó là: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d, vì vậy bất cứ khi nào tôi tìm thấy trong cơ sở dữ liệu chưa được đánh giá, tôi biết mật khẩu. – Skade

1

Về mặt lý thuyết muối phục vụ hai mục đích chính. Đầu tiên là để ngăn chặn các mật khẩu trùng lặp để kết thúc với cùng một giá trị băm trên cơ sở dữ liệu. Thứ hai là tăng độ dài của mật khẩu, do đó cũng làm tăng độ khó của kẻ tấn công khi đoán mật khẩu. Tuy nhiên, có vấn đề trong việc lưu trữ muối, nếu bạn chèn nó vào cơ sở dữ liệu, mục đích thứ hai sẽ bị đánh bại trong trường hợp ai đó lấy dữ liệu đó, lý tưởng là nó nên được lưu trữ ở một vị trí khác, nhưng điều này chỉ cần thiết nếu ứng dụng của bạn rất nhạy cảm!

Nếu mã của ứng dụng của bạn không được công khai, tôi có thể giải thích vấn đề này là tạo ra muối dựa trên giá trị tĩnh của mỗi người dùng, như ngày tạo hoặc tên người dùng, bởi vì nếu ai đó đọc cơ sở dữ liệu không rõ liệu bạn có sử dụng muối hay không ...

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