Hàm password_verify() làm gì?

“Bí quyết là đảm bảo nỗ lực “phá vỡ” hàm băm vượt quá giá trị mà thủ phạm sẽ thu được khi làm như vậy. Không có gì trong số này là về việc "không thể bị tấn công"; . ” — Cuộc săn thành Troy

Giảm thiểu/Salting
Với một loại muối, hàm băm không chỉ dựa trên giá trị của mật khẩu. Đầu vào được tạo thành từ mật khẩu cộng với muối.
ĐIỂM CẦN LƯU Ý
Thuật toán MD5 và thuật toán SHA1 được coi là không an toàn khi sử dụng và không được Google chấp nhận do xảy ra xung đột mật mã.

Google khuyên bạn nên sử dụng các thuật toán băm mạnh hơn như SHA-256 và SHA-3. Các tùy chọn khác thường được sử dụng trong thực tế là bcrypt, scrypt, PBKDF2

SHA là viết tắt của "Thuật toán băm an toàn" và đó là cách chuyển đổi một chuỗi có kích thước bất kỳ thành số thập lục phân 40 bit có thể được sử dụng để xác minh. Nếu bạn không biết băm là gì, thì chúng giống như mã hóa một chiều [một chiều] được thiết kế để kiểm tra tính chính xác của đầu vào. Theo một chiều, ý tôi là bạn không thể chạy $hash = sha1[$somestring], sau đó bằng cách nào đó giải mã $hash để lấy $somestring - điều đó là không thể, vì hàm băm không chứa văn bản gốc của nó. Sau đó, băm tốt để làm gì?

Chà, hãy tưởng tượng bạn có người dùng nhập mật khẩu. Làm thế nào để bạn kiểm tra mật khẩu là chính xác?


Mặc dù giải pháp đó chắc chắn hoạt động, nhưng điều đó có nghĩa là bất kỳ ai đọc mã nguồn của bạn đều lấy được mật khẩu của bạn. Tương tự như vậy, nếu bạn lưu trữ tất cả mật khẩu của người dùng trong cơ sở dữ liệu của mình và ai đó bẻ khóa nó, bạn sẽ trông khá ngu ngốc. Nếu bạn băm mật khẩu của mọi người trên cơ sở dữ liệu hoặc trong tệp của mình thì những người dùng có ý đồ xấu sẽ không thể truy xuất mật khẩu ban đầu. Đó không phải là lý tưởng – hãy xem phần "Băm mật khẩu" bên dưới - nhưng nó khá phổ biến

Một nhược điểm của mật khẩu băm là người dùng được ủy quyền cũng sẽ không thể lấy được mật khẩu - đó có phải là điều tốt hay không tùy thuộc vào từng trường hợp, nhưng thường thì việc có mật khẩu băm là đáng giá và những người quên mật khẩu của họ chỉ cần

Băm được sử dụng phổ biến nhất để kiểm tra xem các tệp đã được tải xuống đúng chưa - nếu hàm băm của bạn bằng với giá trị băm chính xác, thì bạn đã tải xuống tệp mà không gặp sự cố

Quá trình băm dữ liệu liên quan đến việc lấy một giá trị và chuyển đổi nó thành một chuỗi ký tự và số có độ dài cố định. Không có cách nào - không có cách nào - để "giải mã" một hàm băm để lấy giá trị ban đầu. Cách duy nhất để hack một hàm băm là thử tất cả các kết hợp đầu vào có thể có, với điều kiện là đầu vào cho hàm băm có thể dài bao nhiêu tùy thích, có thể mất nhiều thời gian

Hãy xem xét kịch bản này


Đây là đầu ra tôi nhận được

aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
66f52c9f1a93eac0630566c9b82b26f91d727001

Có ba điều quan trọng cần chú ý ở đó. trước tiên, tất cả đầu ra có độ dài chính xác là 40 ký tự và sẽ luôn như vậy. Thứ hai, sự khác biệt giữa hàm băm của "xin chào" và hàm băm của "Xin chào" là rất lớn mặc dù sự khác biệt duy nhất là thay đổi số mũ nhỏ. Cuối cùng, lưu ý rằng không có cách nào để phân biệt giữa chuỗi dài và chuỗi ngắn - vì hàm băm không thể đảo ngược [nghĩa là bạn không thể trích xuất đầu vào ban đầu từ hàm băm], bạn có thể tạo hàm băm gồm hàng triệu ký tự trong

Nếu bạn đã lưu trữ mật khẩu của người dùng được băm trong cơ sở dữ liệu của mình thì bạn cần băm mật khẩu mà họ cung cấp trước khi so sánh mật khẩu đó với giá trị trong cơ sở dữ liệu của bạn. Một điều quan trọng cần nhớ là sha1[] sẽ luôn cho cùng một đầu ra cho một đầu vào nhất định

Lưu ý của tác giả. Nếu bạn đặt tham số thứ hai tùy chọn thành true, hàm băm SHA1 được trả về ở định dạng nhị phân thô và sẽ có độ dài là 20

Băm mật khẩu

Băm dữ liệu bằng sha1 là một cách tuyệt vời để tạo các giá trị băm không quan trọng và trong một thời gian dài, đây cũng là cách phổ biến nhất để băm mật khẩu. Nhưng khi tội phạm mạng ngày càng phức tạp, sha1[] đơn giản cũ đã không thực sự theo kịp thời gian, kể từ PHP 5. 5 có một cách thông minh hơn. password_hash[]

Hàm mới này có một vài ưu điểm so với sha1[]. Đầu tiên, nó tạo ra một hàm băm khác cho cùng một chuỗi nếu bạn chạy đi chạy lại nó, điều đó có nghĩa là hàm băm cho mật khẩu "Frosties" sẽ khác nhau mỗi lần. Điều này nghe có vẻ như nó phá vỡ điểm băm, nhưng password_hash[] đang rất thông minh. nó sử dụng một hạt giống ngẫu nhiên khác nhau mỗi khi nó chạy, sau đó đặt hạt giống ngẫu nhiên đó bên trong hàm băm mà nó tạo ra. Điều này cho phép các kết quả đầu ra khác nhau để không thể sử dụng các bảng cầu vồng [tra cứu khổng lồ các giá trị băm được tính toán trước] để bẻ khóa mật khẩu, đồng thời đảm bảo có thể xác minh hàm băm

Ưu điểm thứ hai là password_hash[] nhận tham số thứ hai cho phép bạn chỉ định thuật toán, nhưng bạn có thể chỉ định "PASSWORD_DEFAULT" để nó tự động sử dụng thuật toán được đề xuất. Đây là một lợi thế vì thuật toán có thể thay đổi theo thời gian để ngày càng mạnh hơn khi cần thiết mà bạn không cần phải thay đổi mã của mình. Và đừng lo lắng về khả năng tương thích ngược. password_hash[] cũng lưu tên thuật toán vào giá trị băm của nó, do đó, nó có thể xác minh giá trị băm ngay cả khi thuật toán bị thay đổi

Lưu ý của tác giả. Vì thuật toán băm có thể thay đổi trong tương lai, bạn nên đảm bảo rằng bạn phân bổ đủ dung lượng trong cơ sở dữ liệu của mình và không phân bổ vừa đủ để trả lại giá trị băm của ngày hôm nay. Hướng dẫn tham khảo PHP đề xuất có thể chứa 255 ký tự

Chúng ta hãy xem một ví dụ băm mật khẩu cơ bản


Như bạn có thể thấy, mã đó băm cùng một mật khẩu ba lần. Chạy mã đó, đây là đầu ra tôi nhận được

$2y$10$qR5hC3OpCiz/fPeP4/04O. lJ0tesCNoL6ieqD9v6bnWbWkv4FcqVe $2y$10$OefiTIclfHSE4TcdAlM/1. h7ckUxWjDlg3w8xFVM/nk53cL3jAEkO $2y$10$fj3g2tKkGo6BSKXXEVNTxOwMD8DrXMsS0mINoUP. eX4cA34vHKN/K

Như bạn có thể thấy, mỗi đầu ra là khác nhau, điều đó có nghĩa là bạn không thể xác minh mật khẩu của người dùng chỉ bằng cách so sánh chuỗi cơ bản như bạn có thể làm với sha1[]. Thay vào đó, bạn cần sử dụng một hàm khác có tên là password_verify[], lấy mật khẩu văn bản thuần túy của người dùng làm tham số đầu tiên và một hàm băm để so sánh làm giá trị thứ hai. Sau đó, nó băm mật khẩu văn bản thuần túy bằng cách sử dụng cùng một hạt giống ngẫu nhiên như đã được sử dụng trong hàm băm và trả về true nếu chúng khớp. Đây là một ví dụ


Điều đáng chú ý là cả password_hash[] và password_verify[] đều chậm hơn đáng kể so với sha1[]. Khi bạn đang làm việc với mật khẩu, chi phí tăng thêm này không đáng kể so với mức tăng bảo mật hệ thống của bạn, nhưng đối với dữ liệu khác không nhạy cảm với bảo mật, sha1[] là lựa chọn tốt hơn

Bạn muốn học PHP 7?

Hacking with PHP đã được cập nhật đầy đủ cho PHP 7 và hiện có sẵn dưới dạng PDF có thể tải xuống. Nhận hơn 1200 trang học PHP thực hành ngay hôm nay

Nếu điều này hữu ích, vui lòng dành chút thời gian để nói với những người khác về Hacking với PHP bằng cách tweet về nó

password_verify hoạt động như thế nào?

Hàm password_verify[] được dùng để khớp mật khẩu băm với mật khẩu ban đầu . Một hàm khác, password_hash[] được sử dụng để tạo giá trị băm dựa trên thuật toán băm, chi phí và giá trị muối. Hàm password_verify[] chứa tất cả thông tin băm để xác minh hàm băm bằng mật khẩu.

password_verify trả về cái gì?

Giá trị trả về ¶ . true if the password and hash match, or false otherwise.

Làm cách nào để xác minh mật khẩu băm?

Bạn sẽ cần xác minh mật khẩu người dùng để xem chúng có khớp với mật khẩu được lưu trữ trong cơ sở dữ liệu không. Để làm điều này, chúng tôi gọi check[] trên mặt tiền Hash . Phương thức check[] xác minh xem chuỗi văn bản thuần do người dùng nhập có khớp với hàm băm đã cho hay không. Đoạn mã trên sử dụng mặt tiền Hash cùng với phương thức check[].

password_hash hoạt động như thế nào?

Hàm password_hash[] có thể tạo hàm băm mật khẩu mới bằng thuật toán băm một chiều mạnh . Hàm password_hash[] tương thích với hàm crypt[], do đó, hàm băm mật khẩu được tạo bởi hàm crypt[] có thể được sử dụng với hàm password_hash[].

Chủ Đề