2017-12-01 27 views
6

Vì vậy, tôi nghe nói rằng PHP 7.2 đã giới thiệu Argon2 algorithm mới. Nhưng tôi đang bối rối về cách tôi có thể sử dụng nó với mã hiện tại của tôi. Ví dụ: tôi có điều nàyLàm cách nào để sử dụng thuật toán Argon2 với password_hash?

$password = password_hash('somepassword', PASSWORD_DEFAULT, ['cost' => 12]); 

Hiện PASSWORD_DEFAULT hiện có sử dụng Argon2 không? Điều gì, nếu có, tôi cần phải thay đổi với password_verify? Bcrypt có được coi là không an toàn ngay bây giờ không?

Trả lời

8

Argon2 là gì? Bcrypt có tệ không?

Trước PHP 7.2, thuật toán băm duy nhất password_hash được sử dụng là bcrypt. Theo văn bản này, bcrypt vẫn được coi là một băm mạnh, đặc biệt là so với người tiền nhiệm của nó, md5sha1 (cả hai đều là insecure because they are fast). Argon2 là simply a costlier algorithm to brute force

Argon2i sử dụng truy cập bộ nhớ không phụ thuộc vào dữ liệu. Nó là chậm hơn bởi vì nó làm cho nhiều hơn qua bộ nhớ để bảo vệ khỏi thương mại giảm các cuộc tấn công. Nó là rất khuyến khích cho băm mật khẩu và dựa trên mật khẩu dựa trên derivation.

Bcrypt vẫn là mã băm được chấp nhận cho mật khẩu. Không cần phải chuyển đổi nếu bạn không muốn (như bản phát hành 7.2.0). Ngoài ra, PASSWORD_DEFAULT chỉ nên thay đổi (mỗi PHP Internals policy) trên bản phát hành đầy đủ tiếp theo (7.3.0 trở lên). Nếu bạn muốn đảm bảo bạn tiếp tục chỉ với bcrypt, bạn có thể sử dụng PASSWORD_BCRYPT để thay thế. Điều này là không cần thiết, tuy nhiên, như chúng ta sẽ thảo luận dưới đây.

Bạn sử dụng Argon2 như thế nào?

Trước tiên, chúng tôi sẽ chuyển đối số thứ hai của password_hash qua PASSWORD_ARGON2I và sau đó chúng tôi cần thay đổi các tùy chọn của mình. bcrypt sử dụng cost làm tham số cho số lần nó lặp qua mật khẩu (chi phí cao hơn = thời gian băm dài hơn). Có yếu tố chi phí khác nhau, tuy nhiên

password_hash('somepassword', PASSWORD_ARGON2I, ['memory_cost' => 2048, 'time_cost' => 4, 'threads' => 3]); 

From the manual chúng ta thấy những gì các tùy chọn này làm

  • memory_cost - bộ nhớ tối đa (tính bằng byte) có thể được sử dụng để tính toán hash Argon2 (mặc định 1024)
  • time_cost - Thời gian tối đa có thể tính để băm Argon2 (mặc định 2 giây)
  • threads - Số lượng chủ đề để sử dụng để tính toán hàm băm Argon2 (mặc định 2)

Hiểu được, trước khi bạn thay đổi những điều này, chi phí cao hơn ở đây sẽ làm chậm tập lệnh của bạn. Bạn sẽ muốn chạy thử nghiệm trên máy chủ của mình để tìm cài đặt phù hợp nhất với bạn. Điều này thường bằng cách lặp qua nhiều lần lặp lại của một chi phí nhất định. PHP manual gives an example of this nếu bạn cần.

Cũng lưu ý rằng, trong khi bcrypt lưu trữ 60 ký tự, Argon2 có thể yêu cầu nhiều hơn thế. Bạn nên, lý tưởng, làm cho mật khẩu của bạn lưu trữ 255 ký tự.

Chúng tôi thay đổi điều gì trong password_verify?

Câu trả lời ở đây là ... không có gì.Hiểu rằng password_verify đủ thông minh để tìm ra thuật toán nào đã được sử dụng và xử lý nó một cách thích hợp. Như đã đề cập ở trên, điều này có nghĩa là nếu bạn đang sử dụng PASSWORD_DEFAULT, mặc định có thể thay đổi và không ảnh hưởng tiêu cực đến bạn. password_verify chỉ cần yêu cầu thuật toán hỗ trợ. Nếu bạn chuyển từ bcrypt sang Argon2, cả hai sẽ xác minh theo cùng một cách, vì tất cả các dữ liệu cần thiết (muối, băm và chi phí) được lưu trữ cho bạn.

//Works for both bcrypt and Argon2 
if(password_verify($user_password, $stored_hash); 

Nếu bạn muốn nâng cấp băm từ bcrypt, bạn có thể làm điều này khi người dùng đăng nhập thành công (và do đó cung cấp cho bạn mật khẩu chưa băm). Chỉ cần kiểm tra xem hàm băm của bạn có bắt đầu bằng $2y$ (điểm đánh dấu bcrypt) hay không. Nếu có, hãy chuyển lại mật khẩu đã cung cấp đến password_hash một lần nữa, nhưng với đối số Argon2 và lưu nó vào trường mật khẩu của người dùng đã đăng nhập.

+0

Sẽ rất hữu ích cho câu trả lời này để thêm cách tải Argon2 vào các mô-đun thời gian chạy PHP. Bạn trả lời ngụ ý PHP 7.2 có nó theo mặc định trong khi tôi chỉ có thể hiển thị trên các thiết lập của tôi mà PHP 7.1 * không *, Cheers – Martin

+1

@Martin Không có module để tải. Nếu bạn đang chạy 7.2.0 hoặc mới hơn thì có ('password_hash' là [core PHP] (http://php.net/manual/en/password.installation.php)). Tôi không biết về bất kỳ tùy chọn backporting nào, nếu đó là ý của bạn. – Machavity

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