Hàm crypt() của PHP
Định nghĩa và cách sử dụng
Hàm crypt() trả về chuỗi đã mã hóa bằng phương pháp DES, Blowfish hoặc MD5.
Hành vi của hàm này khác nhau trên các hệ điều hành khác nhau, một số hệ điều hành hỗ trợ nhiều loại phương pháp mã hóa. Khi cài đặt, PHP sẽ kiểm tra phương pháp nào có sẵn và sử dụng phương pháp nào.
Cụ thể của phương pháp mã hóa phụ thuộc vào định dạng và độ dài của tham số muối. Muối có thể làm tăng độ an toàn của mã hóa bằng cách tăng số lượng chuỗi được tạo ra bởi chuỗi đặc biệt của phương pháp mã hóa cụ thể.
Đây là một số hằng số được sử dụng cùng với hàm crypt(). Giá trị của các hằng số này được thiết lập bởi PHP khi cài đặt.
Thư viện hằng số:
[CRYPT_SALT_LENGTH] | Chiều dài mã hóa mặc định. Sử dụng mã hóa DES tiêu chuẩn, chiều dài là 2 |
[CRYPT_STD_DES] | Hợp đồng dựa trên phương pháp DES tiêu chuẩn sử dụng hai ký tự trong ký tự "./0-9A-Za-z" làm giá trị muối. Sử dụng ký tự không hợp lệ trong giá trị muối sẽ dẫn đến việc crypt() thất bại. |
[CRYPT_EXT_DES] | Hợp đồng dựa trên phương pháp DES mở rộng. Giá trị muối là chuỗi ký tự 9 ký tự, bao gồm một dấu gạch dưới sau đó là 4 byte số lần lặp và 4 byte giá trị muối. Chúng được mã hóa thành ký tự có thể in, mỗi ký tự 6 bit, ưu tiên nhất là các bit có giá trị hiệu dụng thấp nhất. Từ 0 đến 63 được mã hóa thành "./0-9A-Za-z". Sử dụng ký tự không hợp lệ trong giá trị muối sẽ dẫn đến việc crypt() thất bại. |
[CRYPT_MD5] | Băm MD5 sử dụng chuỗi giá trị muối bắt đầu bằng $1$ với 12 ký tự. |
[CRYPT_BLOWFISH] | Thủ thuật Blowfish sử dụng giá trị muối sau: “$2a$”, một tham số cost hai chữ số, “$” và một chuỗi 64 ký tự được tạo thành từ các ký tự trong “./0-9A-Za-z”. Sử dụng ký tự ngoài phạm vi này trong giá trị muối sẽ dẫn đến crypt() trả về một chuỗi rỗng. Tham số cost hai chữ số là logarit cơ số 2 của số lần lặp lại, phạm vi là 04-31. Vi phạm phạm vi này sẽ dẫn đến crypt() thất bại. |
CRYPT_SHA256 | Thủ thuật SHA-256 sử dụng một chuỗi 16 ký tự bắt đầu bằng $5$ để băm. Nếu chuỗi giá trị muối bắt đầu bằng “rounds=<N>$”, giá trị số của N sẽ được sử dụng để chỉ định số lần lặp lại của băm, điều này tương tự như tham số cost của thuật toán Blowfish. Số lần lặp lại mặc định là 5000, nhỏ nhất là 1000, lớn nhất là 999,999,999. Giá trị N vượt ra ngoài phạm vi này sẽ được chuyển đổi thành giá trị gần nhất. |
CRYPT_SHA512 | Thủ thuật SHA-512 sử dụng một chuỗi 16 ký tự bắt đầu bằng $6$ để băm. Nếu chuỗi giá trị muối bắt đầu bằng “rounds=<N>$”, giá trị số của N sẽ được sử dụng để chỉ định số lần lặp lại của băm, điều này tương tự như tham số cost của thuật toán Blowfish. Số lần lặp lại mặc định là 5000, nhỏ nhất là 1000, lớn nhất là 999,999,999. Giá trị N vượt ra ngoài phạm vi này sẽ được chuyển đổi thành giá trị gần nhất. |
Trên các hệ thống hỗ trợ nhiều thuật toán, nếu hỗ trợ các hằng số trên thì đặt thành "1", nếu không thì đặt thành "0".
Ghi chú:Không có hàm giải mã tương ứng. Hàm crypt() sử dụng một thuật toán một chiều.
Ngữ pháp
crypt(str,muối)
Tham số | Mô tả |
---|---|
str | Bắt buộc. Định nghĩa chuỗi cần mã hóa. |
muối | Tùy chọn. Sử dụng để tăng số lượng ký tự được mã hóa, để làm cho mã hóa an toàn hơn. Nếu không cung cấp tham số muối, mỗi lần gọi hàm PHP sẽ tạo ngẫu nhiên một giá trị. |
Chi tiết kỹ thuật
Giá trị trả về: | Trả về chuỗi đã mã hóa hoặc một chuỗi ít hơn 13 ký tự, để đảm bảo rằng khi thất bại nó sẽ khác biệt với giá trị muối. |
Phiên bản PHP: | 4+ |
Cập nhật日志
Phiên bản | Giải thích |
---|---|
5.3.2 | Dựa trên việc thực hiện của Ulrich Drepper, thêm crypt dựa trên thuật toán SHA-256 và SHA-512. |
5.3.2 | Sửa lỗi do vấn đề vòng lặp bất hợp pháp của thuật toán Blowfish, trả về chuỗi "thất bại" ("*0" hoặc "*1") thay vì chuyển sang sử dụng thuật toán DES. |
5.3.0 | PHP hiện tại bao gồm việc thực hiện MD5 của riêng nó, bao gồm thuật toán DES tiêu chuẩn, thuật toán DES mở rộng và thuật toán Blowfish. Nếu hệ thống thiếu việc thực hiện tương ứng, PHP sẽ sử dụng việc thực hiện của riêng nó. |
Mô hình
Ví dụ 1
Trong ví dụ này, chúng ta sẽ kiểm tra các thuật toán khác nhau:
<?php // Salt là 2 ký tự if (CRYPT_STD_DES == 1) { echo "DES tiêu chuẩn: ".crypt('something','st')."\n<br>"; } else { echo "DES tiêu chuẩn không được hỗ trợ.\n<br>"; } // Salt là 4 ký tự if (CRYPT_EXT_DES == 1) { echo "DES mở rộng: ".crypt('something','_S4..some')."\n<br>"; } else { echo "DES mở rộng không được hỗ trợ.\n<br>"; } // Bắt đầu bằng $1$, 12 ký tự if (CRYPT_MD5 == 1) { echo "MD5: ".crypt('something','$1$somethin$')."\n<br>"; } else { echo "MD5 không được hỗ trợ.\n<br>"; } // Salt bắt đầu bằng $2a$. Đ参数 cost là số đôi: 09. 22 ký tự if (CRYPT_BLOWFISH == 1) { echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>"; } else { echo "Blowfish DES không được hỗ trợ.\n<br>"; } // Salt bắt đầu bằng $5$ là 16 ký tự. Số mặc định là 5000. if (CRYPT_SHA256 == 1) { echo "SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>"; else { echo "SHA-256 not supported.\n<br>"; } // Salt bắt đầu bằng $5$ là 16 ký tự. Số mặc định là 5000. if (CRYPT_SHA512 == 1) { echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$'); } else { echo "SHA-512 not supported."; } ?>
Kết quả đầu ra của mã trên (tùy thuộc vào hệ điều hành):
Standard DES: stqAdD7zlbByI Extended DES: _S4..someQXidlBpTUu6 MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w. Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9 SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/ oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.