(PHP 4, PHP 5)
crypt – Băm chuỗi 1 chiều
Miêu tả hàm crypt
1 |
string crypt ( string $str [, string $salt ] ) |
Salt là tham số tùy chọn. Tuy nhiên, crypt() sẽ tạo ra mật khẩu yếu nếu không có salt. Từ PHP 5.6 trở đi sẽ xuất hiện lỗi E_NOTICE nếu không có salt. Hãy chắc chắn rằng chỉ định tham số salt đủ mạnh để bảo mật tốt hơn.
Hàm password_hash() sử dụng hàm băm mạnh, tạo ra salt mạnh, áp dụng tự động trong các vòng băm. password_hash() chỉ đơn giản là bao gồm crypt() và tương thích với mật khẩu băm có sẵn. Khuyến khích sử dụng password_hash().
Một vài hệ điều hành hỗ trợ nhiều kiểu băm. Trong thực thế, đôi khi các thuật toán tiêu chuẩn dựa trên DES được thay thế bằng một thuật toán dựa trên MD5. Kiểu băm được kích hoạt bởi tham số salt. Từ phiển bản 5.3 trở về trước, PHP sẽ xác định các thuật toán có sẵn tại thời điểm cài đặt dựa trên hàm crypt() của hệ thống. Nếu không có tham số salt, PHP sẽ tự động tạo ra một chuẩn hai ký tự salt (DES) hoặc mười hai ký tự (MD5), phụ thuộc vào tính sẵn có của MD5 crypt(). PHP thiết lập một hằng số tên là CRYPT_SALT_LENGTH, nó sẽ quyết định độ dài nhất của salt cho các hàm băm sẵn có.
crypt() dựa trên chuẩn DES trả về salt là 2 ký tự đầu tiên của kết quả. Nó cũng chỉ sử dụng tám ký tự đầu tiên của $str, vì vậy dù chuỗi dài hơn nhưng nếu tám ký tự đầu tiên giống nhau sẽ cho ra cùng một kết quả (khi sử dụng cùng một salt).
Trên hệ thống mà hàm crypt() hỗ trợ nhiều kiểu băm, những hằng số sau đây sẽ được thiết lập là 0 hoặc 1, tùy thuộc vào kiểu băm sẵn có:
- CRYPT_STD_DES – Băm dựa trên chuẩn DES với 2 ký tự salt từ bảng chữ cái “./0-9A-Za-z”. Sử dụng các ký tự không hợp lệ trong salt sẽ dẫn tới hàm crypt() bị lỗi.
- CRYPT_EXT_DES – Băm dựa trên DES mở rộng. salt là một chuỗi 9 ký tự bao gồm một gạch dưới sau đó là 4 bytes đếm lặp và 4 bytes của salt. Đây là những ký tự đã được mã hóa, 6 bits cho mỗi ký tự, ký tự đầu tiên ít quan trọng nhất. Những giá trị từ 0 đến 63 được mã hóa thành “./0-9A-Za-z”. Sử dụng các ký tự không hợp lệ trong salt sẽ dẫn tới hàm crypt() bị lỗi.
- CRYPT_MD5 – băm bằng MD5 với một salt mười hai ký tự bắt đầu bằng $1$
- CRYPT_BLOWFISH – băm bằng Blowfish với salt là: “$2a$”, “$2x$” hoặc “$2y$”, tham số gồm 2 chữ số, “$”, và 22 ký tự từ bảng chữ cái “./0-9A-Za-z”. Sử dụng những ký tự ngoài dải này cho salt sẽ dẫn tới việc crypt() trả về một chuỗi độ dài là 0. Hai chữ số trong phần tham số log cơ số 2 của của vòng lặp cho nền tảng thuật toán băm dựa trên Blowfish và phải ở trong dài từ 04-31, những giá trị ngoài dải này sẽ dẫn tới hàm crypt() bị lỗi. Trước phiên bản 5.3.7, PHP chỉ hỗ trợ “$2a$” như là một tiền tố của salt: PHP 5.3.7 giới thiệu các tiền tố mới để khắc phục một điểm yếu bảo mật trong việc thực thi Blowfish. Vui lòng tham khảo tài liệu này để biết thêm chi tiết về những lỗi bảo mật đã được khắc phục, nhưng tóm lại, các nhà phát triển chỉ tập trung vào PHP phiên bản 5.3.7 trở về sau nên ưu tiên sử dụng “$2y$” hơn “$2a$”.
- CRYPT_SHA256 – băm bằng SHA-256 với mười sáu ký tự salt có tiền tố là $5$. Nếu chuỗi salt bắt đầu với ’rounds=<N>$’, giá trị của số N sẽ được sử dụng để quyết định vòng lặp băm sẽ chạy bao nhiêu lần, nhiều như tham số của Blowfish. Mặc định số vòng lặp là 5000, nhỏ nhất là 1000 và lớn nhất là 999,999,999. Bất kỳ giá trị nào của N ngoài dải này sẽ được thay đổi tới giá trị giới hạn gần nhất.
- CRYPT_SHA512 – băm bằng SHA-512 với mười sáu ký tự salt có tiền tố là $6$.Nếu chuỗi salt bắt đầu với ’rounds=<N>$’, giá trị của số N sẽ được sử dụng để quyết định vòng lặp băm sẽ chạy bao nhiêu lần, nhiều như tham số của Blowfish. Mặc định số vòng lặp là 5000, nhỏ nhất là 1000 và lớn nhất là 999,999,999. Bất kỳ giá trị nào của N ngoài dải này sẽ được thay đổi tới giá trị giới hạn gần nhất.
Kể từ PHP 5.3.0, PHP có chứa thuật toán riêng và sẽ sử dụng chúng nếu hệ thống thiếu hỗ trợ những thuật toán này.
Tham số
string
Chuỗi ký tự cần băm.
salt
Tham số sẽ quyết định thuật toán nào được thực thi. Nếu không có, thuật toán sẽ tự động cung cấp tham số và có thể dẫn đến kết quả sẽ không như mong đợi.
Giá trị trả về
Trả về chuỗi băm hoặc một chuỗi ngắn hơn 13 ký tự và được đảm bảo khác với tham số salt nếu quá trình băm bị thất bại.
Ví dụ
Ví dụ 1 về hàm crypt()
1 2 3 4 5 6 7 8 |
<?php $hashed_password = crypt('mypassword'); // Tham số salt sẽ tự động được tạo /* Bạn nên sử dụng hash_equals để tránh xảy ra lỗi khi so sánh 2 chuỗi băm bởi 2 thuật toán khác nhau */ if (hash_equals($hashed_password, crypt($user_input, $hashed_password)) { echo "Mật khẩu đã được xác thực!"; } ?> |
Ví dụ 2: sử dụng crypt() với htpasswd
1 2 3 4 5 6 7 |
<?php // Đặt mật khẩu $password = 'mypassword'; // Lấy chuỗi băm, để salt tự động được tạo ra $hash = crypt($password); ?> |
Ví dụ 3: sử dụng crypt() với những thuật toán băm khác nhau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php /* Đây là những tham số salts chỉ dành cho ví dụ, cần phải thay đổi khi sử dụng. Bạn phải tạo ra tham số salt đúng định dạng cho mỗi mật khẩu. */ if (CRYPT_STD_DES == 1) { echo 'Chuẩn DES: ' . crypt('rasmuslerdorf', 'rl') . "\n"; } if (CRYPT_EXT_DES == 1) { echo 'DES mở rộng: ' . crypt('rasmuslerdorf', '_J9..rasm') . "\n"; } if (CRYPT_MD5 == 1) { echo 'MD5: ' . crypt('rasmuslerdorf', '$1$rasmusle$') . "\n"; } if (CRYPT_BLOWFISH == 1) { echo 'Blowfish: ' . crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') . "\n"; } if (CRYPT_SHA256 == 1) { echo 'SHA-256: ' . crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$') . "\n"; } if (CRYPT_SHA512 == 1) { echo 'SHA-512: ' . crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$') . "\n"; } ?> |
1 2 3 4 5 6 |
Chuẩn DES: rl.3StKT.4T8M DES mở rộng: _J9..rasmBYk8r9AiWNc MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0 Blowfish: $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi SHA-256: $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6 SHA-512: $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21 |