2012-04-05 46 views
9

Tôi đang làm việc trên một hệ thống đã được băm mật khẩu người dùng với MD5 (không có muối). Tôi muốn lưu trữ mật khẩu an toàn hơn bằng cách sử dụng SHA-512 và một muối.Sử dụng SHA-512 và muối để băm mật khẩu băm MD5?

Mặc dù điều này đủ dễ thực hiện cho mật khẩu trong tương lai, tôi cũng muốn trang bị thêm mật khẩu băm MD5 hiện có, tốt nhất là không buộc tất cả người dùng phải thay đổi mật khẩu của họ. Ý tưởng của tôi là chỉ sử dụng SHA-512 và một muối thích hợp để băm băm MD5 hiện có. Sau đó, tôi có thể đặt một số cờ trong cơ sở dữ liệu cho biết mật khẩu nào đã được băm từ văn bản thuần túy và những mật khẩu nào được băm từ một băm MD5. Hoặc tôi chỉ có thể thử cả khi xác thực người dùng. Hoặc thậm chí chỉ cần băm mật khẩu mới với MD5 và sau đó SHA-512/muối, để chúng có thể được xử lý giống như mật khẩu cũ.

Theo lập trình, tôi không nghĩ đây là vấn đề, nhưng tôi không biết đủ về mã hóa/băm để biết liệu tôi có ảnh hưởng đến chất lượng của băm theo bất kỳ cách nào bằng cách áp dụng SHA-512/băm muối vào mật khẩu đã được MD5 băm. Bản năng đầu tiên của tôi là nếu có bất cứ điều gì, nó sẽ mạnh mẽ hơn, một chiếc chìa khóa rất nhẹ kéo dài.

Bản năng thứ hai của tôi là tôi không thực sự biết những gì tôi đang nói, vì vậy tôi nên nhận được lời khuyên. Có suy nghĩ gì không?

+0

SHA-512 sẽ cung cấp cải tiến rất ít so với MD5 (ví dụ: 'MD5 (muối + mật khẩu)' thực tế tương đương với 'SHA512 (muối + mật khẩu)'). Chức năng băm mục đích chung như MD5 và gia đình SHA đã được ** không ** được xây dựng để lưu trữ mật khẩu. Sử dụng bcrypt. – NullUserException

+0

Rất đúng. Tôi thực sự có ý định làm chìa khóa kéo dài, nhưng không làm rõ điều đó trong câu hỏi của tôi. Tôi đã kết thúc bằng cách sử dụng PBKDF2 thay vì ngây thơ thực hiện thuật toán kéo dài khóa của riêng tôi. –

Trả lời

6

Thành phần chức năng với nguyên thủy mật mã là nguy hiểm và không nên thực hiện nếu có thể tránh được. Giải pháp phổ biến cho loại vấn đề của bạn là giữ cả hai băm cho giai đoạn di chuyển, sử dụng hàm băm mới khi có thể và nâng cấp một cách minh bạch các mật khẩu cũ (khi bạn kiểm tra mật khẩu và mật khẩu khớp, hãy khôi phục lại bằng thuật toán mới và lưu trữ)

Điều này sẽ không hoạt động nếu bạn có lược đồ dựa trên thử thách mà bạn không thấy mật khẩu thô, nhưng vì bạn dường như có một muối được lưu trữ không thay đổi, tôi cho rằng ứng dụng của bạn có băm .

+0

Đây là một câu trả lời tuyệt vời. Tôi đã thực hiện chính xác loại giải pháp này trước đây và đó là một cách tuyệt vời để làm điều đó. – jeffsix

+0

Cảm ơn bạn đã đề xuất về việc khôi phục trong suốt khi người dùng đăng nhập! Bạn có bất kỳ liên kết nào giải thích tại sao việc áp dụng giá trị băm SHA-512 cho giá trị băm MD5 ít an toàn hơn khi áp dụng hàm băm SHA-512 cho mật khẩu thuần văn bản không? Tôi quan tâm để biết lý do tại sao ... –

+1

@ JeremiahOrr: Đối với ứng dụng cụ thể của bạn, việc sử dụng thích hợp một muối đủ dài không thể đoán trước sẽ làm nhiều hơn về an ninh hơn là thay đổi sơ đồ băm. Theo j13r giải thích, việc áp dụng SHA lên MD5 sẽ không mở rộng không gian của các băm có thể, vì chúng bị ràng buộc bởi các kết quả có thể có của MD5. Ngoài ra, việc sử dụng chức năng một chiều được tối ưu hóa đặc biệt cho mật khẩu sẽ tốt hơn, ví dụ [PBKDF2] (http://en.wikipedia.org/wiki/PBKDF2). – mensi

1

Tin tưởng bản năng thứ hai của bạn. Sử dụng một thư viện hiện có được tạo ra đặc biệt cho mật khẩu băm thay vì cố gắng tự nấu ăn.

Có thể băm mật khẩu mới của bạn bằng MD5 và sau đó băm MD5 bằng thư viện băm mật khẩu của bạn. Bằng cách đó, bạn có thể duy trì khả năng tương thích ngược với mật khẩu cũ của mình.

I.e. password_hash (Tất cả cũ, mật khẩu md5'd) và password_hash (md5 (password mới))

(Cảnh báo: Tôi không phải là chuyên gia mật mã)

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

+0

Ồ, tôi không có ý định nấu thư viện băm của riêng mình, tôi chỉ cần biết phải làm gì với mật khẩu băm MD5 hiện có! –

+0

Tôi không có chuyên gia mật mã nhưng tôi chỉ chạy một hàm băm mật khẩu trên các mật khẩu MD5 hiện có. Đối với mật khẩu mới, trước tiên bạn sẽ làm thuật toán MD5 cũ, sau đó đưa nó vào một hàm băm mật khẩu thích hợp. Điều đó, hoặc bạn bằng cách nào đó có thể đánh dấu liệu mật khẩu có đang sử dụng thuật toán cũ hoặc mới trong cơ sở dữ liệu hay không (hoặc bất cứ nơi nào bạn đang lưu trữ nó). – tangrs

+0

@tangrs Mật khẩu ban đầu của anh ta cũng được băm MD5, nó đã được bảo mật. Anh ta muốn chuyển sang SHA-512 với muối an toàn hơn. Tại sao bạn sẽ gợi ý cho anh ta đôi băm? Điều đó vẫn sẽ không giải quyết được vấn đề làm thế nào để nói sự khác biệt giữa mật khẩu mới và cũ. Và để tăng gấp đôi băm là an ninh thông qua tối tăm, mà chỉ là tốt như không có bảo mật, bởi vì không ai biết những gì đang xảy ra và làm thế nào để duy trì nó. – Churk

4

Nếu bạn băm với MD5 đầu tiên, bạn sẽ chỉ có sự lây lan của MD5 (128 bit). Một phần lớn không gian của SHA512 sẽ không được bảo vệ bởi mật khẩu của bạn. Vì vậy, bạn không tận dụng lợi thế của SHA512, nhưng nó sẽ không tồi tệ hơn MD5.

Bạn có lợi ích là nếu ai đó có được mã băm SHA512 và không biết muối (điều này bạn phải thực thi bằng cách nào đó) không thể tra cứu băm và lấy mật khẩu - điều có thể thực hiện được với Cơ sở dữ liệu MD5 bạn hiện có.

Vì vậy, có, bạn chỉ có thể khôi phục mật khẩu MD5 hiện có. Nhưng như đã giải thích trong đoạn đầu tiên, sẽ là một ý tưởng tồi khi áp dụng MD5 cho tất cả các mật khẩu mới và sau đó băm chúng thành SH512. Việc thực hiện dễ dàng sẽ là có trường 'muối' boolean trong cơ sở dữ liệu bên cạnh các băm (nhưng không đặt muối ở đó).

+0

'nhưng không đặt muối đó' - toàn bộ điểm của một muối là nó không phải được giữ bí mật và chỉ có thể được đặt plaintext bên cạnh các giá trị băm (bạn có một băm duy nhất cho mỗi mật khẩu!). Ngoài ra: Có phải là "băm mật khẩu MD5 với SHA-512 sẽ không gây hại gì" dựa trên bất kỳ sự kiện thực tế nào hay chỉ là một số trực giác? Bởi vì nói chung áp dụng một số băm theo thứ tự có thể làm hại nhiều hơn tốt .. – Voo

+0

Điểm của hàm băm là nó cung cấp một ánh xạ duy nhất giữa một chuỗi có kích thước biến và một số bit n. Bất kỳ hàm băm tốt nào tránh va chạm, và trên thực tế rất khó để tạo ra các va chạm trên SHA-512 và thậm chí cả MD5 (trừ khi bạn có độ dài tùy ý, mà bạn không có mật khẩu). Ánh xạ một giá trị 128 bit vào một không gian 512 bit là tầm thường để làm (bạn có 2^(512-128) giá trị không sử dụng). Va chạm (là tác hại) rất khó xảy ra (xác suất 2^(128-512)). – j13r

0

Nếu bạn xem cách hầu hết Ngân hàng và nhân viên bảo mật cao thực hiện thay đổi mật khẩu.Hầu hết trong số họ về cơ bản yêu cầu những người đang sử dụng phương pháp mã hóa cũ để tạo mật khẩu mới. Tôi nghĩ rằng bạn giải pháp đầu tiên của việc đặt một lá cờ trên tất cả người dùng MD5 cũ, và thông báo cho họ rằng họ cần tạo mật khẩu mới và từ từ di chuyển chúng sang hệ thống mới. Bằng cách đó, khi bạn gặp sự cố khi chụp hệ thống nếu gặp sự cố, bạn sẽ không hỏi đây là người dùng mới hay người dùng cũ. Chúng ta có băm đôi hay đơn? Không bao giờ nên so sánh hai băm như một câu trả lời có thể bởi vì nếu MD5 ('abc') => 123, SHA ('NO') => 123, điều đó có nghĩa là ai đó có thể đã nhập sai mật khẩu nhưng vẫn được nhập.

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