2012-02-23 74 views
21

Tôi đang bắt đầu một trang web và tôi đang cố gắng quyết định cách mã hóa mật khẩu người dùng để lưu trữ chúng trong cơ sở dữ liệu SQL.Cải thiện băm mật khẩu với một muối ngẫu nhiên

Tôi nhận thấy rằng việc sử dụng md5 (mật khẩu) đơn giản là rất không an toàn. Tôi đang xem xét sử dụng một sha512 (password.salt), và tôi đã nghiên cứu cách tốt nhất để tạo ra một muối hữu ích. Tôi đọc rất nhiều bài báo nói rằng một muối nên càng ngẫu nhiên càng tốt để thêm entropy vào băm và nó trông giống như một ý tưởng tuyệt vời. Nhưng:

  • bạn cần lưu trữ muối ngẫu nhiên cùng với băm của bạn
  • cho rằng kẻ tấn công bằng cách nào đó có quyền truy cập vào mật khẩu băm của bạn (và đang cố gắng để đảo ngược băm để plain text), nó có nghĩa là ông có thể bán cơ sở dữ liệu của bạn, sau đó có quyền truy cập vào các muối ngẫu nhiên của bạn cũng

Không rõ ràng là giá trị tìm kiếm lạ bên cạnh hàm băm trong cơ sở dữ liệu là một muối? Nếu kẻ tấn công có thể truy cập vào muối cùng với giá trị băm, làm thế nào là an toàn hơn?

Có ai có chuyên môn trong lĩnh vực đó không? Cảm ơn!

+0

Đừng quên rằng sau khi tất cả điều này, bạn vẫn cần mật khẩu tốt. –

+2

@PeeHaa: Người tấn công có cần bảng cầu vồng cho mỗi giá trị muối không? –

+4

Một muối là có để ngăn chặn một cuộc tấn công bảng cầu vồng. Bây giờ kẻ tấn công sẽ phải tạo một bảng cầu vồng cho mỗi muối thay vì chỉ một cho tất cả các hồ sơ. – PeeHaa

Trả lời

40

Kẻ tấn công là "được phép" để biết muối - bảo mật của bạn phải được thiết kế theo cách thậm chí với kiến ​​thức về muối nó vẫn an toàn.

không muối làm gì?

trợ Salt trong việc bảo vệ chống lại các cuộc tấn công brute-force sử dụng "cầu vồng-bảng" tính toán trước.
Muối làm cho sức mạnh vũ phu đắt hơn nhiều (theo thời gian/bộ nhớ) cho kẻ tấn công.
Tính toán một bảng như vậy là tốn kém và thường chỉ được thực hiện khi nó có thể được sử dụng cho nhiều hơn một cuộc tấn công/mật khẩu.
NẾU bạn sử dụng cùng một muối cho tất cả mật khẩu, kẻ tấn công có thể tính toán trước một bảng như vậy và sau đó brute-force mật khẩu của bạn thành cleartext ...
Miễn là bạn tạo ra một muối ngẫu nhiên mới (tốt nhất có mật mã mạnh) cho mọi mật khẩu bạn muốn lưu trữ băm của không có vấn đề.

NẾU bạn muốn để tăng cường an ninh hơn nữa
Bạn có thể tính toán băm vài lần (băm băm vv) - điều này không chi phí bạn nhiều nhưng nó làm cho một cuộc tấn công brute-force/tính "cầu vồng-bảng" thậm chí đắt hơn ... xin đừng phát minh bản thân - có được chứng minh phương pháp tiêu chuẩn để làm như vậy, xem ví dụ http://en.wikipedia.org/wiki/PBKDF2http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard

LƯU ý:

Sử dụng một cơ chế như vậy là những ngày này mandatrory vì "thời gian CPU" (có thể sử dụng cho các cuộc tấn công như bảng cầu vồng/sức mạnh vũ phu ...) ngày càng phổ biến rộng rãi hơn (xem ví dụ thực tế dịch vụ đám mây của Amazon là một trong 50 siêu máy tính nhanh nhất trên toàn thế giới) được sử dụng bởi bất cứ ai cho một số lượng tương đối nhỏ)!

+9

Hoặc thậm chí thời gian GPU tốt hơn – PeeHaa

+0

Cảm ơn câu trả lời tuyệt vời! – Tchoupi

15

cho rằng kẻ tấn công bằng cách nào đó có quyền truy cập vào mật khẩu băm của bạn (và đang cố gắng để đảo ngược băm để plain text), nó có nghĩa là ông lẽ đổ cơ sở dữ liệu của bạn, sau đó có quyền truy cập vào các muối ngẫu nhiên của bạn cũng

toàn bộ vấn đề của muối là để đánh bại "bảng cầu vồng":

http://en.wikipedia.org/wiki/Rainbow_table

Xem lý do tại sao một muối đủ dài đánh bại bất kỳ bảng cầu vồng nào theo phần "Phòng vệ chống lại các bảng cầu vồng".

cách bảo mật hơn?

Nó được sử dụng để an toàn hơn vì nó buộc kẻ tấn công thử phương pháp tiếp cận vũ lực rất tốn kém thay vì nhìn ngay trong các bảng cầu vồng được bàn trước. Nếu bạn có muối 64 bit, kẻ tấn công cần có 2^64 bảng cầu vồng được tính toán trước thay vì một ... Nói cách khác: nó làm cho các bảng cầu vồng vô dụng. Tuy nhiên, lưu ý rằng các GPU hiện đại có thể crack hàng tỷ mật khẩu mỗi giây khiến cho kẻ tấn công lưu trữ các bảng cầu vồng lớn (thay vì lưu trữ hàng tỷ băm, đơn giản là tính toán chúng trong vài giây).

Ngày nay bạn muốn lưu trữ "mật khẩu" của bạn sử dụng một cái gì đó giống như PBKDF2 hoặc scrypt.

-1

Dưới đây là một bài viết tốt về mật mã: http://www.javacodegeeks.com/2012/02/introduction-to-strong-cryptography-p1.html

Xem phần Real World Sử dụng Hash Algorithms, Kịch bản 1 để thảo luận các muối.

tôi khuyên bạn nên sử dụng http://docs.oracle.com/javase/6/docs/api/java/security/SecureRandom.html để tạo ra muối của bạn

+2

Có lẽ vì câu hỏi là về PHP và bạn nên sử dụng một thư viện Java. –

+1

Và có lẽ vì câu trả lời của bạn dễ bị tổn thương với linkrot. Bạn nên bao gồm phần chính xác của bài viết có liên quan đến câu hỏi trong câu trả lời của bạn. – kba

+1

Ah, tôi nghĩ rằng tôi đang xem xét các câu hỏi được gắn thẻ Java khi tôi nhấp vào đây. Bản thân câu hỏi không bao giờ thực sự đề cập đến PHP. Tuy nhiên, một người không phải là upvote có lẽ sẽ có đủ điều kiện. Tôi lưu downvotes cho câu trả lời thô lỗ hoặc tích cực vô ích, nhưng tôi đoán đó chỉ là phong cách của tôi ... –

0

Sức mạnh của băm của bạn, mật khẩu muối dựa trên tất cả các yếu tố sau:

  • Sức mạnh của thuật toán băm
  • Sự ngẫu nhiên của muối
  • Độ ngẫu nhiên của mật khẩu

Hệ thống của bạn mạnh như hệ thống yếu nhất ở trên.

0

Các câu hỏi bên dưới là từ trang web chị em Security StackExchange. Họ thảo luận về băm, muối, PBKDF2, bcrypt, scrypt và một số thứ khác.

Ngoài ra còn có một số cuộc thảo luận trước đó từ đây trên StackOverflow cũng như:

Is BCrypt a good hashing algorithm to use in C#? Where can I find it?

Trong trả lời ngắn gọn cho bạn câu hỏi, muối là một biện pháp tự vệ làm cho nó mất nhiều thời gian để khôi phục mật khẩu trong trường hợp thỏa hiệp cũng giống như một băm. Nếu tấn công một mật khẩu, muối sẽ không tạo ra sự khác biệt.Nếu cố gắng sử dụng từ điển được tính toán trước hoặc kiểm tra nhiều mật khẩu cùng một lúc, việc có một muối khác nhau cho mỗi mục nhập sẽ làm tăng đáng kể lượng công việc cần thiết và thường tạo ra một bảng cầu vồng phù hợp không khả thi.

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