2010-01-25 58 views
11

Tôi hiện đang sử dụng chức năng md5 để mã hóa mật khẩu của mình và lưu vào mysql db mà không thể giải mã được.Cách tốt hơn để lưu mật khẩu trong mysql có thể được giải mã cũng bằng cách sử dụng php

Bây giờ người dùng của tôi muốn rằng khi họ quên mật khẩu, họ sẽ nhận được cùng một mật khẩu cũ (cũ) thay vì mật khẩu mới.

Vì vậy, câu hỏi của tôi là những gì tôi nên sử dụng để mã hóa mật khẩu của mình và lưu trữ trong cơ sở dữ liệu mysql. Và tôi cũng có thể giải mã mật khẩu đó.

tôi đang chạy trên php và mysql.

Cảm ơn

Avinash

+2

Suy nghĩ kỹ trước khi triển khai phương pháp này ... bạn sẽ giới thiệu nhiều vấn đề bảo mật hơn giải quyết. –

+15

Mật khẩu bạn có thể quay lại giá trị ban đầu là BAD. Đừng làm thế. – Erik

+1

Gần đây, vi phạm mật khẩu đang trở nên rất phổ biến. Nếu bạn không có mật khẩu người dùng trong cơ sở dữ liệu của bạn, họ không thể bị đánh cắp dễ dàng. http://news.google.com.vn/news?q=password+breach – Piskvor

Trả lời

14

Đừng làm điều đó ...

Thứ nhất, sử dụng một cái gì đó tốt hơn so với md5. Sau đó, tạo một cách để "đặt lại" mật khẩu, nhưng không bao giờ là cách để thực sự truy xuất mật khẩu từ db ...

Điều đó sẽ làm cho ứng dụng của bạn kém an toàn hơn, nhưng thậm chí còn tệ hơn; bạn và người dùng của bạn sẽ gặp sự cố nếu dữ liệu của bạn bị đánh cắp! Ai đó sẽ có cơ sở dữ liệu với tên người dùng và mật khẩu của tất cả người dùng của bạn!

+0

+1 để đặt lại mật khẩu. Có điều gì sai với md5() và nếu có, ví dụ về cái gì tốt hơn là gì? Tôi thực sự quan tâm đến bản thân mình. –

+1

@Pekka: Đọc một bài viết của WP: http://en.wikipedia.org/wiki/Md5 MD5 là một phương tiện tuyệt vời để băm các tập tin để kiểm tra tính toàn vẹn và như vậy, nhưng không còn là một công cụ mã hóa cập nhật nữa . –

+1

@Pekka: Điều này: http://en.wikipedia.org/wiki/MD5#Collision_vulnerability Một cái gì đó tốt hơn: hãy kiểm tra SHA-512, để bắt đầu. – Piskvor

4

Việc mã hóa thay vì băm có nghĩa là bạn phải lưu trữ khóa giải mã, điều đó có nghĩa là giảm bảo mật cho ứng dụng của bạn. Đặt lại mật khẩu của họ và gửi mật khẩu mới.

+2

Cách duy nhất để đi. Mật khẩu của người dùng không phải là doanh nghiệp (chủ sở hữu trang web và lập trình viên) của chúng tôi. –

1

Đừng làm điều đó, nó sẽ làm tổn hại đến bảo mật của bạn! Toàn bộ ý tưởng mã hóa một chiều là nếu cơ sở dữ liệu của bạn bị tấn công, bạn sẽ không gặp phải vấn đề mà tất cả mật khẩu người dùng của bạn sẽ được biết cùng với địa chỉ email của họ!

0

Đó không phải là an toàn để làm điều đó bạn tốt hơn có thể tạo ra một cách để đặt lại mật khẩu

+0

Tại sao gửi một phút trả lời dư thừa sau khi mã-zoop's? Chỉ cần bỏ phiếu của anh/cô ấy lên. –

0

Nếu bạn đang chạy một trang web tin nội bộ không có vấn đề an ninh, chỉ cần lưu trữ mật khẩu với XOR 0xAD từng byte. Nếu không, đặt lại là tùy chọn duy nhất.

0
  • tạo các muối động (2, một 'vĩnh viễn' để kết hợp với mật khẩu trước khi băm/mã hóa, một động khác, thay đổi mỗi khi người dùng đăng nhập);

    $dynamicSalt = ''; 
    for ($i = 0; $i < 8; $i++) 
    {  
        $dynamicSalt .= chr(rand(33, 126)); 
    } 
    
  • không bao giờ lưu mật khẩu trong bất cứ cách nào có thể giúp bạn 'giải mã' chúng sau này, nó không phải là tùy thuộc vào bạn để lấy mật khẩu ban đầu nhưng để cho phép người dùng thiết lập lại nó

Nếu bạn thực sự cần để lưu mật khẩu ban đầu, hãy tạo một tài khoản cơ sở dữ liệu với quyền WRITE và lưu trữ nó trong một số cơ sở dữ liệu khác (trên một máy chủ khác?).

0

Không thể để lưu trữ mật khẩu trong một cách như vậy mà nó vẫn còn khả năng thu hồi mà không cần một trong hai

1) lưu trữ các khóa giải mã trong mã của bạn/dữ liệu (mà thay vì đánh bại mục đích băm/mã hóa mật khẩu)

2) mã hóa mật khẩu bằng mã hóa khóa công khai/riêng tư định tuyến khôi phục thông qua một loại quy trình bán thủ công, nơi có thể khôi phục mật khẩu.

Giải pháp đơn giản nhất là yêu cầu người dùng của bạn cung cấp/duy trì địa chỉ email hiện tại và dựa vào tính bảo mật để cung cấp mật khẩu mới theo yêu cầu.

C.

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