2010-03-31 29 views
18

Với những điểm yếu đã biết của MD5 và các điểm yếu gần đây (tháng 5 năm 2009) được thảo luận trong SHA1, các chương trình mới nên được ăn mặn như thế nào & băm mật khẩu của chúng?Thuật toán băm được đề xuất để sử dụng cho mật khẩu được lưu trữ là gì?

Tôi đã xem SHA-256 và SHA-512 được đề xuất.

Lập trình chủ yếu trong Ruby on Rails và sử dụng PostgreSQL - nhưng các ngôn ngữ và môi trường khác cũng có thể phải tính toán băm mật khẩu.

+2

Cảm ơn Martin, tôi hiểu điều đó. Đó là một câu hỏi hẹp và xứng đáng là một câu trả lời hẹp. – Hissohathair

Trả lời

21

SHA-256 và SHA-512 an toàn trong tương lai gần. Chúng thuộc về gia đình SHA-2, mà không có cuộc tấn công nào được xác định cho đến nay. This wikipedia page nói rằng các nhà cung cấp Unix và Linux hiện đang chuyển sang SHA-2 để băm mật khẩu an toàn của họ. Gia đình SHA-3, với các thuật toán mạnh hơn, đang được phát triển, nhưng sẽ không sẵn sàng cho đến năm 2012 ít nhất.

P.S: Trừ khi bạn đang giấu tên đại lý bí mật từ chính phủ, bạn cũng sẽ an toàn với SHA-1, nhưng nếu không có sự cố khi triển khai SHA-2, chỉ cần sử dụng SHA-2.

+2

PKCS # 5 (http://www.rsa.com/rsalabs/node.asp?id=2127) thảo luận về một số thông tin tốt khác (như các lần lặp) mà người đọc có thể muốn xem xét. – atk

+2

SHA-1 được coi là bị hỏng. –

+0

@Noon Silk: cần bao nhiêu công suất tính toán để phá vỡ nó? –

17

Sử dụng chức năng chậm như bcrypt. Here là một bài đăng của các anh chàng Phusion.

-4

Bạn nên sử dụng một tên người dùng băm, Mật khẩu và muối với nhau, như:

hash(length(username)+"_veryuniquesalt4rtLMAO"+username+password) 

Bằng cách đó, cơ sở dữ liệu của bạn không phải là dễ bị tổn thương cho bất kỳ bảng cầu vồng hiện có, vì muối, và với tên người dùng băm cùng với mật khẩu, bạn cũng không thể tạo bảng cầu vồng cho phương pháp băm cụ thể của mình.

Sử dụng thuật toán băm "chậm" sẽ bảo vệ mật khẩu tốt hơn, giống như chúng phức tạp hơn, nhưng đó là sự cân bằng, khi bạn đã quyết định mức độ chậm nhất định, bạn không thể chỉ thu nhỏ lại khi bạn cần hiệu suất cho những thứ khác.

Cũng có thể thực hiện các ứng dụng băm chậm bằng JavaScript, theo cách đó nó sẽ không phải là vấn đề hiệu suất, nhưng tất nhiên, phương pháp này sẽ yêu cầu JavaScript được bật.

Không có vấn đề gì bạn chọn, một chút chậm lại là tốt hơn nhiều so với không có gì, sử dụng 1 mili giây thay vì 1 micro giây và bảo vệ của bạn mạnh hơn 1000 lần.

Bạn có thể sử dụng bcrypt, hoặc bạn có thể thực hiện một thuật toán băm thông thường làm nhiều công việc phụ, chỉ cần đảm bảo rằng công việc phụ không phải là nối chuỗi chủ yếu.

Cuối cùng, tốt hơn là không lấy được cơ sở dữ liệu bị đánh cắp, rất nhiều mật khẩu yếu đến mức chúng dễ dàng tách ra bất kể bạn làm gì.

+2

Lưu ý rằng việc bao gồm tên người dùng trong băm sẽ ngăn thay đổi tên người dùng. Tùy thuộc vào yêu cầu hệ thống, điều này có thể hoặc không được mong muốn. ses nơi nó không mong muốn, sử dụng uid (hoặc guid, hoặc tương đương) sẽ là một thay thế. – atk

+1

Bạn chỉ cần làm cho người dùng nhập mật khẩu của mình để thay đổi tên người dùng, thực hành tốt nhất. – aaaaaaaaaaaa

+2

có một lỗi rất tinh vi trong mã của bạn - bạn nên * không bao giờ * dữ liệu concat trong một băm. H (x + y + z) sẽ mở cho bạn tối đa Tấn công kéo dài. Thay vào đó bạn nên: H (H (x + y + z)) hoặc H (H (x) + H (y) + H (z)) –

7

Bạn nên sử dụng hàm dẫn xuất khóa dựa trên mật khẩu làm kết quả uid/pwd; nhất được biết là PBKDF2 http://en.wikipedia.org/wiki/PBKDF2 cũng được định nghĩa là RFC 2898 http://tools.ietf.org/html/rfc2898. PKBDF2 lấy dữ liệu bí mật của bạn cũng như một số muối và một số lần lặp lại. Đây là cách tiêu chuẩn cách giải quyết vấn đề của bạn.

Nếu bạn lập trình bằng .NET, hãy sử dụng Rfc2898DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

+1

Tôi vừa đọc 100 bài báo và câu hỏi về chủ đề này, và có vẻ như đã đồng ý rằng RFC2898 hoặc bất kỳ giải pháp đa vòng lặp nào khác (ví dụ BCrypt) là cách để đi. Nhưng Rfc2898DeriveBytes dựa trên SHA-1, phải không? Nó có lỗi thời không? Và BCrypt dường như không được "xác thực", mặc dù nó trông rất tuyệt. Ngoài ra, Rfc2898DeriveBytes không thực hiện IDisposable, có vẻ như nó có thể rò rỉ mật khẩu thô trong bộ nhớ khá dễ dàng. Nhu cầu thực tế của tôi không phải là hoang tưởng, nhưng tôi muốn đo mức độ an toàn của từng thứ. Bạn sẽ làm gì? Cảm ơn! –

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