Hướng dẫn dùng pbkdf2 trong PHP

TUYÊN BỐ TỪ CHỐI : Câu trả lời này được viết vào năm 2008.

Nội dung chính

  • Liều dùng
  • Tại sao băm mật khẩu?
  • Điều gì làm cho một mật khẩu tốt anyway?
  • Thực hành tốt nhất
  • Thực hành trung bình
  • Thực tiễn trong tương lai
  • Tóm tắt và từ chối mật mã

Kể từ đó, PHP đã cung cấp cho chúng tôi password_hashpassword_verify, kể từ khi được giới thiệu, chúng là phương pháp kiểm tra và băm mật khẩu được đề xuất.

Lý thuyết của câu trả lời vẫn là một đọc tốt mặc dù.

TL; DR

Không

  • Đừng giới hạn những ký tự mà người dùng có thể nhập cho mật khẩu. Chỉ có những kẻ ngốc mới làm điều này.
  • Đừng giới hạn độ dài của mật khẩu. Nếu người dùng của bạn muốn có một câu với supercalifragilisticexpialidocious trong đó, đừng ngăn họ sử dụng nó.
  • Không bao giờ lưu trữ mật khẩu người dùng của bạn trong văn bản đơn giản.
  • Không bao giờ gửi email mật khẩu cho người dùng của bạn trừ khi họ mất mật khẩu và bạn đã gửi mật khẩu tạm thời.
  • Không bao giờ, bao giờ đăng nhập mật khẩu theo bất kỳ cách nào.
  • Không bao giờ băm mật khẩu với SHA1 hoặc MD5 hoặc thậm chí SHA256! Bánh quy hiện đại có thể vượt quá 60 và 180 tỷ băm / giây (tương ứng).
  • Không trộn bcrypt và với đầu ra thô của hàm băm () , sử dụng đầu ra hex hoặc base64_encode. (Điều này áp dụng cho bất kỳ đầu vào nào có thể có sự bất hảo \0trong đó, điều này có thể làm suy yếu nghiêm trọng an ninh.)

Liều dùng

  • Sử dụng tiền điện tử khi bạn có thể; bcrypt nếu bạn không thể.
  • Sử dụng PBKDF2 nếu bạn không thể sử dụng bcrypt hoặc scrypt, với băm SHA2.
  • Đặt lại mật khẩu của mọi người khi cơ sở dữ liệu bị xâm phạm.
  • Thực hiện độ dài tối thiểu 8-10 ký tự hợp lý, cộng với yêu cầu ít nhất 1 chữ cái viết hoa, 1 chữ cái viết thường, một số và ký hiệu. Điều này sẽ cải thiện entropy của mật khẩu, do đó làm cho nó khó bị bẻ khóa hơn. (Xem phần "Điều gì tạo ra một mật khẩu tốt?" Cho một số tranh luận.)

Tại sao băm mật khẩu?

Mục tiêu đằng sau mật khẩu băm rất đơn giản: ngăn chặn truy cập độc hại vào tài khoản người dùng bằng cách xâm phạm cơ sở dữ liệu. Vì vậy, mục tiêu của việc băm mật khẩu là để ngăn chặn tin tặc hoặc kẻ bẻ khóa bằng cách tiêu tốn của chúng quá nhiều thời gian hoặc tiền bạc để tính mật khẩu văn bản đơn giản. Và thời gian / chi phí là yếu tố ngăn chặn tốt nhất trong kho vũ khí của bạn.

Một lý do khác mà bạn muốn băm tốt, mạnh mẽ trên tài khoản người dùng là cung cấp cho bạn đủ thời gian để thay đổi tất cả mật khẩu trong hệ thống. Nếu cơ sở dữ liệu của bạn bị xâm phạm, bạn sẽ cần đủ thời gian để ít nhất khóa hệ thống, nếu không thay đổi mọi mật khẩu trong cơ sở dữ liệu.

Jeremiah Grossman, CTO của Whitehat Security, đã tuyên bố trên blog của mình sau khi khôi phục mật khẩu gần đây yêu cầu phá vỡ sự bảo vệ mật khẩu của anh ta:

Thật thú vị, khi sống trong cơn ác mộng này, tôi đã học được RẤT NHIỀU tôi không biết về việc bẻ khóa mật khẩu, lưu trữ và độ phức tạp. Tôi đã đánh giá cao lý do tại sao việc lưu trữ mật khẩu lại quan trọng hơn nhiều so với độ phức tạp của mật khẩu. Nếu bạn không biết mật khẩu của mình được lưu trữ như thế nào, thì tất cả những gì bạn thực sự có thể phụ thuộc vào là sự phức tạp. Đây có thể là kiến ​​thức phổ biến đối với các mật khẩu và tiền điện tử, nhưng đối với các chuyên gia về bảo mật Web hoặc trung bình, tôi rất nghi ngờ điều đó.

(Nhấn mạnh của tôi.)

Điều gì làm cho một mật khẩu tốt anyway?

Entropy . (Không phải tôi hoàn toàn đăng ký theo quan điểm của Randall.)

Nói tóm lại, entropy là có bao nhiêu biến thể trong mật khẩu. Khi mật khẩu chỉ là chữ cái La Mã viết thường, đó chỉ có 26 ký tự. Đó không phải là nhiều biến thể. Mật khẩu Alpha-số tốt hơn, với 36 ký tự. Nhưng cho phép chữ hoa và chữ thường, với các ký hiệu, là khoảng 96 ký tự. Điều đó tốt hơn nhiều so với chỉ các chữ cái. Một vấn đề là, để làm cho mật khẩu của chúng ta trở nên đáng nhớ, chúng ta chèn các mẫu mà làm giảm entropy. Rất tiếc!

Mật khẩu entropy được xấp xỉ dễ dàng. Sử dụng đầy đủ các ký tự ascii (khoảng 96 ký tự có thể đánh máy) mang lại mức entropy là 6,6 cho mỗi ký tự, với 8 ký tự cho mật khẩu vẫn còn quá thấp (52.679 bit của entropy) để bảo mật trong tương lai. Nhưng tin tốt là: mật khẩu dài hơn và mật khẩu có ký tự unicode, thực sự làm tăng entropy của mật khẩu và làm cho nó khó bị bẻ khóa hơn.

Có một cuộc thảo luận dài hơn về entropy mật khẩu trên trang web Crypto StackExchange . Một tìm kiếm Google tốt cũng sẽ cho ra rất nhiều kết quả.

Trong các bình luận tôi đã nói chuyện với @popnoodles, người đã chỉ ra rằng việc thực thi chính sách mật khẩu có độ dài X với X nhiều chữ cái, số, ký hiệu, v.v., thực sự có thể làm giảm entropy bằng cách làm cho lược đồ mật khẩu dễ dự đoán hơn. Tôi thực sự đồng ý. Randomess, thực sự ngẫu nhiên nhất có thể, luôn là giải pháp an toàn nhất nhưng ít đáng nhớ nhất.

Cho đến nay tôi đã có thể nói, làm cho mật khẩu tốt nhất thế giới là một Catch-22. Nó không đáng nhớ, quá dễ đoán, quá ngắn, quá nhiều ký tự unicode (khó gõ trên thiết bị Windows / Mobile), quá dài, v.v. Không có mật khẩu nào thực sự đủ tốt cho mục đích của chúng tôi, vì vậy chúng tôi phải bảo vệ chúng như thể chúng đã ở Fort Knox.

Thực hành tốt nhất

Bcrypt và tiền điện tử là những thực tiễn tốt nhất hiện nay. Scrypt sẽ tốt hơn bcrypt về thời gian, nhưng nó chưa được xem là tiêu chuẩn của Linux / Unix hoặc bởi các máy chủ web và chưa có đánh giá sâu về thuật toán của nó được đăng. Tuy nhiên, tương lai của thuật toán có vẻ đầy hứa hẹn. Nếu bạn đang làm việc với Ruby, có một viên ngọc mã hóa sẽ giúp bạn thoát ra và Node.js hiện có gói mã hóa riêng . Bạn có thể sử dụng Scrypt trong PHP thông qua tiện ích mở rộng Scrypt hoặc tiện ích mở rộng Libsodium (cả hai đều có sẵn trong PECL).

Tôi đặc biệt khuyên bạn nên đọc tài liệu về chức năng mật mã nếu bạn muốn hiểu cách sử dụng bcrypt hoặc tìm cho mình một trình bao bọc tốt hoặc sử dụng một cái gì đó như PHPASS để triển khai hợp pháp hơn. Tôi khuyên bạn nên tối thiểu 12 vòng bcrypt, nếu không phải là 15 đến 18.

Tôi đã thay đổi suy nghĩ về việc sử dụng bcrypt khi tôi biết rằng bcrypt chỉ sử dụng lịch biểu chính của blowfish, với cơ chế chi phí biến đổi. Cái sau cho phép bạn tăng chi phí để bắt bẻ mật khẩu bằng cách tăng lịch trình khóa đắt tiền của blowfish.

Thực hành trung bình

Tôi gần như không thể tưởng tượng được tình huống này nữa. PHPASS hỗ trợ PHP 3.0.18 đến 5.3, vì vậy có thể sử dụng trên hầu hết mọi cài đặt có thể tưởng tượng được và nên được sử dụng nếu bạn không biết chắc chắn rằng môi trường của bạn hỗ trợ bcrypt.

Nhưng giả sử rằng bạn không thể sử dụng bcrypt hoặc PHPASS. Sau đó thì sao?

Hãy thử triển khai PDKBF2 với số vòng tối đa mà môi trường / ứng dụng / nhận thức của người dùng của bạn có thể chịu đựng được. Số lượng thấp nhất tôi muốn giới thiệu là 2500 vòng. Ngoài ra, hãy đảm bảo sử dụng hash_hmac () nếu có sẵn để làm cho thao tác khó tái tạo hơn.

Thực tiễn trong tương lai

Đến với PHP 5.5 là một thư viện bảo vệ mật khẩu đầy đủ giúp tóm tắt mọi khó khăn khi làm việc với bcrypt. Mặc dù hầu hết chúng ta bị mắc kẹt với PHP 5.2 và 5.3 trong hầu hết các môi trường phổ biến, đặc biệt là các máy chủ được chia sẻ, @ircmaxell đã xây dựng một lớp tương thích cho API sắp tới tương thích ngược với PHP 5.3.7.

Tóm tắt và từ chối mật mã

Sức mạnh tính toán cần thiết để thực sự bẻ khóa mật khẩu băm không tồn tại. Cách duy nhất để máy tính "bẻ khóa" mật khẩu là tạo lại nó và mô phỏng thuật toán băm được sử dụng để bảo mật nó. Tốc độ của hàm băm có liên quan tuyến tính với khả năng bị ép buộc. Tệ hơn nữa, hầu hết các thuật toán băm có thể dễ dàng song song để thực hiện nhanh hơn. Đây là lý do tại sao các chương trình tốn kém như bcrypt và tiền điện tử rất quan trọng.

Bạn không thể thấy trước tất cả các mối đe dọa hoặc con đường tấn công, và vì vậy bạn phải nỗ lực hết sức để bảo vệ người dùng của mình lên phía trước . Nếu bạn không, thì bạn thậm chí có thể bỏ lỡ sự thật rằng bạn đã bị tấn công cho đến khi quá muộn ... và bạn phải chịu trách nhiệm . Để tránh tình trạng đó, hãy hành động hoang tưởng để bắt đầu. Tấn công phần mềm của riêng bạn (nội bộ) và cố gắng đánh cắp thông tin đăng nhập của người dùng hoặc sửa đổi tài khoản của người dùng khác hoặc truy cập dữ liệu của họ. Nếu bạn không kiểm tra tính bảo mật của hệ thống, thì bạn không thể đổ lỗi cho bất kỳ ai trừ chính bạn.

Cuối cùng: Tôi không phải là một nhà mật mã học. Bất cứ điều gì tôi đã nói là ý kiến ​​của tôi, nhưng tôi tình cờ nghĩ rằng nó dựa trên ý thức chung của ol ... và rất nhiều việc đọc. Hãy nhớ rằng, hãy hoang tưởng hết mức có thể, khiến mọi thứ trở nên khó xâm nhập nhất có thể, và sau đó, nếu bạn vẫn lo lắng, hãy liên hệ với một hacker mũ trắng hoặc nhà mật mã để xem họ nói gì về mã / hệ thống của bạn.

936 hữu ích 5 bình luận chia sẻ