Hướng dẫn dùng ascii hash trong PHP

Hàm hash() sẽ mã hóa chuỗi truyền vào theo một thuật toán nhất định. Thuật toán mã hóa sẽ do người dùng cung cấp.

Hướng dẫn dùng ascii hash trong PHP

Hướng dẫn dùng ascii hash trong PHP

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Cú pháp

Cú pháphash( $algo, $str ,$raw_output);

Trong đó:

  • $algo là thuật toán mã hóa.
  • $str là chuỗi cần mã hóa.
  • $raw_output là tham số, mặc định mang giá trị FALSE chuỗi trả về sẽ là chuỗi in thường thập phân. Nếu $raw_output mang giá trị TRUE chuỗi trả về sẽ là chuỗi theo kiểu nhị phân.

Kết quả trả về

Hàm sẽ trả về chuỗi được tính toán dưới dạng nhị phân nếu $raw_output mang giá trị TRUE, và trả về chuỗi được tính toán dưới dạng thập phân nếu $raw_output mang giá trị FALSE .

Bài viết này được đăng tại [free tuts .net]

Ví dụ

Mã hóa theo kiểu "ripemd160":

Code

echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.') . "<br />";
echo hash('ripemd160', 'The quick brown fox jumped over the lazy dog.', true);

Kết quả

5c6ffbdd40d9556b73a21e63c3e0e904
ec457d0a974c48d5685a7efa03d137dc8bbde7e3

Mã hóa theo kiểu "md5":

Code

echo hash('md5', 'The quick brown fox jumped over the lazy dog.') . "<br />";
echo md5("The quick brown fox jumped over the lazy dog.") . "<br />";

Kết quả

5c6ffbdd40d9556b73a21e63c3e0e904
5c6ffbdd40d9556b73a21e63c3e0e904

Tham khảo: php.net

Ví dụ và cách sử dụng crypt để băm chuỗi 1 chiều trong PHP.

in Hàm xử lý chuỗi trong PHP

(PHP 4, PHP 5)
crypt – Băm chuỗi 1 chiều

Miêu tả hàm crypt

stringcrypt(string$str[,string$salt])

Hàm crypt() sẽ trả về một chuỗi băm bằng cách sử dụng thuật toán Unix DES tiêu chuẩn hoặc các thuật toán thay thế có thể có sẵn trên hệ thống.

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.

Lưu ý:

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.

Cảnh báo: Sử dụng thuật toán CRYPT_BLOWFISH, tham số $str sẽ có độ dài tối đa là 72 ký tự.

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.

Cảnh báo: Khi kiểm tra tính hợp lệ của mật khẩu, một hàm so sánh chuỗi có thể là lỗ hổng cho timing attacks khi so sánh ký tự đầu ra của hàm crypt() với chuỗi đã được băm. PHP 5.6 trở đi cung cấp hàm hash_equals() cho mục đích này.

Ví dụ

Ví dụ 1 về hàm crypt()

<?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

<?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";

}

?>

Ví dụ trên sẽ in ra màn hình kết quả tương tự như sau:

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