2009-03-15 90 views
7

Tôi muốn mã hóa mật khẩu trên trang web của mình bằng cách sử dụng mã hóa 2 chiều trong PHP. Tôi đã đi qua thư viện mcrypt, nhưng nó có vẻ rất cồng kềnh. Bất kỳ ai biết về bất kỳ phương pháp nào khác dễ dàng hơn nhưng vẫn an toàn? Tôi có quyền truy cập vào khung công tác Zend, do đó, một giải pháp sử dụng nó sẽ làm tốt.Cách tốt nhất để thực hiện mã hóa 2 chiều bằng PHP là gì?

Tôi thực sự cần mã hóa 2 chiều vì khách hàng của tôi muốn chuyển sang db và thay đổi mật khẩu hoặc truy xuất mật khẩu.

+2

Tại sao khách hàng muốn truy xuất mật khẩu? Đây thường là một ý tưởng tồi. Cung cấp cho các cơ sở quản trị để đặt lại mật khẩu và người dùng có thể thay đổi mật khẩu nếu họ biết nguyên bản. –

Trả lời

24

Bạn nên lưu trữ mật khẩu băm (và properly salted).

Không có lý do gì trên thế giới đủ tốt để phá vỡ quy tắc này.

Hiện tại, sử dụng crypt, với CRYPT_BLOWFISH là phương pháp hay nhất.
CRYPT_BLOWFISH trong PHP là triển khai mã băm Bcrypt. Bcrypt dựa trên mật mã khối Blowfish.

  • Nếu khách hàng của bạn cố gắng đăng nhập, bạn băm mật khẩu đã nhập và so sánh nó với băm được lưu trữ trong DB. nếu chúng khớp nhau, quyền truy cập được cấp.

  • Nếu khách hàng của bạn muốn thay đổi mật khẩu, họ sẽ cần phải thực hiện nó một số tập lệnh nhỏ, đúng cách băm mật khẩu mới và lưu nó vào DB.

  • Nếu khách hàng của bạn muốn khôi phục mật khẩu, mật khẩu ngẫu nhiên mới sẽ được tạo và gửi cho khách hàng của bạn. Mã băm của mật khẩu mới được lưu trữ trong DB

  • Nếu khách hàng của bạn muốn tra cứu mật khẩu hiện tại, họ đã hết may mắn. Và đó chính là điểm của mật khẩu băm: hệ thống không biết mật khẩu, vì vậy nó không bao giờ có thể được 'tra cứu'/bị đánh cắp.

Jeff viết blog về nó: You're Probably Storing Passwords Incorrectly

Nếu bạn muốn sử dụng một thư viện chuẩn, bạn có thể có một cái nhìn tại địa chỉ: Portable PHP password hashing framework và chắc chắn rằng bạn sử dụng các thuật toán CRYPT_BLOWFISH.

(Nói chung, rối tung xung quanh với các bản ghi trong cơ sở dữ liệu của bạn trực tiếp là yêu cầu cho các rắc rối.
Nhiều người-bao gồm DB rất có kinh nghiệm administrators- đã nhận ra điều đó một cách khó khăn.)

+0

Tôi nghĩ rằng bạn muốn chỉnh sửa câu lệnh đầu tiên của mình để đọc: "Bạn nên lưu trữ mật khẩu được băm" –

+0

Eeeeh, vâng, cảm ơn :) – Jacco

+1

Ý của bạn là viết Blowfish ở đây? Blowfish == mã hóa khóa đối xứng, không băm. Tôi rất muốn giới thiệu băm trên mã hóa. – thomasrutter

7

Không mã hóa mật khẩu. Bạn không bao giờ thực sự cần phải giải mã chúng, bạn chỉ cần xác minh chúng. Sử dụng mcrypt không tốt hơn nhiều so với không làm gì cả, vì nếu một hacker đột nhập vào trang web của bạn và lấy cắp mật khẩu được mã hóa, họ cũng có thể lấy cắp khóa được sử dụng để mã hóa chúng.

Tạo một "mật khẩu" duy nhất cho ứng dụng php của bạn, nơi bạn lấy mật khẩu của người dùng, nối nó với một muối và chạy chuỗi kết quả thông qua hàm băm sha-256 và trả về kết quả. Bất cứ khi nào bạn cần xác minh mật khẩu, bạn chỉ cần xác minh rằng mã băm của mật khẩu khớp với băm trong cơ sở dữ liệu.

http://phpsec.org/articles/2005/password-hashing.html

+0

Thx. Tôi chỉ cần thêm dòng này vào câu hỏi của tôi - Tôi thực sự cần mã hóa 2 chiều vì khách hàng của tôi muốn đi vào db và thay đổi mật khẩu hoặc truy xuất nó. – Bamerza

+2

Vâng, bạn cũng có thể chỉ cần XOR mật khẩu với khóa "PleaseHackMe". Nghiêm túc, mặc dù, thuyết phục khách hàng của bạn rằng họ chỉ cần thiết lập lại mật khẩu - không lấy nó. –

+0

Đây là một câu trả lời hay, ngoại trừ việc tôi sẽ không đề xuất thuật toán SHA-1, điều này đã được chứng minh là có thể dễ dàng phá vỡ hơn so với nó. Tôi muốn giới thiệu SHA-256, hoặc một trong những gia đình đó (SHA-384, SHA-512, v.v.). – thomasrutter

4

Khi bạn thực sự cần phải lấy lại mật khẩu sau này, bạn ít nhất nên sử dụng các phím tư nhân và công cộng để kẻ tấn công sẽ cần khóa riêng (mà không nên được lưu trữ trên cùng một máy) để giải mã mật khẩu.

2 chức năng để thực hiện được mục tiêu này là openssl_public_encrypt()openssl_private_decrypt()

+0

Điều này nghe có vẻ giống như phương pháp duy nhất để thực hiện mục tiêu này và có một số bảo mật ít nhất. –

+0

M_CRYPT là thư viện được thiết kế cho các công cụ mã hóa và giải mã dữ liệu, thư viện OpenSSL được sử dụng cho các liên lạc bí mật/bảo mật. – Jacco

+0

Đây là câu trả lời hợp lý. Tôi cũng sẽ thêm vào đó rằng bạn không bao giờ nên lưu trữ khóa riêng ở bất cứ đâu trên cùng một máy chủ hoặc bất kỳ máy chủ liên quan nào. Nó là tương đối dễ dàng để tìm kiếm toàn bộ đĩa cứng cho một khóa. – thomasrutter

1

Hoặc lưu nó trong rõ ràng, hoặc lưu trữ một băm (tức là không thể đảo ngược) của mật khẩu.

Làm bất cứ điều gì khác - đặc biệt là sử dụng mã hóa đối xứng với khóa mã hóa cứng - về cơ bản là vô nghĩa.

Nếu bạn làm như bạn đề xuất và máy của bạn bị xâm nhập, kẻ tấn công sẽ không chỉ truy cập vào mật khẩu được mã hóa mà còn mã và khóa để giải mã chúng, vì vậy chúng cũng có thể được lưu trữ rõ ràng.

Nếu bạn muốn bảo vệ dữ liệu của mình chống lại ai đó có quyền truy cập vật lý vào máy, hãy sử dụng hệ thống tệp được mã hóa (nhưng vẫn lưu trữ mật khẩu trong cơ sở dữ liệu trong đó rõ ràng). Tất nhiên mỗi lần khởi động lại, bạn sẽ cần phải nhập thủ công khóa trước khi hệ thống có thể sử dụng được.

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