PHP - Hashing: Hướng dẫn cho người mới bắt đầu

Xin chào các nhà phát triển PHP đang trên đà trở thành cao thủ! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới của việc băm (hashing). Đừng lo lắng nếu bạn chưa từng nghe đến băm trước đây - vào cuối bài hướng dẫn này, bạn sẽ có thể băm như một chuyên gia!

PHP - Hashing

Băm là gì?

Trước khi chúng ta đi sâu vào chi tiết, hãy bắt đầu từ những điều cơ bản. Hãy tưởng tượng bạn có một thông điệp bí mật và bạn muốn chuyển nó thành một mã mà không thể nào giải mã được. Đó chính xác là điều mà băm làm! Nó lấy đầu vào của bạn (như mật khẩu hoặc một tệp) và chuyển đổi nó thành một chuỗi ký tự có kích thước cố định. Chuỗi này được gọi là hash.

Dưới đây là một ví dụ thú vị: hãy tưởng tượng băm như một máy xay魔术. Bạn bỏ bất kỳ nguyên liệu nào vào (đầu vào của bạn) và nó luôn cho bạn một ly sinh tố có cùng kích thước (hash), nhưng với hương vị độc đáo tùy thuộc vào những gì bạn bỏ vào.

Ứng dụng của Băm

Bây giờ, bạn có thể tự hỏi, "Tại sao chúng ta cần băm?" Câu hỏi tuyệt vời! Băm có rất nhiều ứng dụng trong thế giới szám toán. Hãy cùng khám phá một số trong số chúng:

  1. Lưu trữ mật khẩu: Thay vì lưu trữ mật khẩu dưới dạng văn bản thô (điều này hoàn toàn không an toàn), các trang web lưu trữ hash của mật khẩu bạn. Khi bạn đăng nhập, họ băm những gì bạn đã nhập và so sánh nó với hash đã lưu trữ.

  2. Đảm bảo tính toàn vẹn dữ liệu: Băm có thể xác minh xem một tệp có bị篡改 hay không. Nếu chỉ cần một byte thay đổi, toàn bộ hash sẽ khác!

  3. Chữ ký số: Chúng sử dụng băm để đảm bảo tính xác thực của các tài liệu số.

  4. Lưu trữ cache: Các trang web lớn sử dụng băm để nhanh chóng truy xuất dữ liệu cache.

Quá trình băm

Hãy chia quá trình băm thành các bước đơn giản:

  1. Lấy một đầu vào (như một mật khẩu).
  2. Áp dụng một thuật toán băm lên nó.
  3. Nhận được một đầu ra có kích thước cố định (hash).

Phần hay nhất là: không quan trọng đầu vào của bạn dài hay ngắn, đầu ra (hash) sẽ luôn có cùng độ dài cho một thuật toán cụ thể.

Các thuật toán băm trong PHP

PHP hỗ trợ nhiều thuật toán băm. Hãy cùng nhìn vào một số thuật toán phổ biến nhất:

  1. MD5 (Message Digest algorithm 5)
  2. SHA-1 (Secure Hash Algorithm 1)
  3. SHA-256 (phần của họ SHA-2)
  4. Bcrypt (đặc biệt tốt cho mật khẩu)

Mỗi trong số này có những ưu điểm và trường hợp sử dụng riêng. Ví dụ, bcrypt được thiết kế đặc biệt cho việc băm mật khẩu và an toàn hơn MD5 hoặc SHA-1 cho mục đích này.

Các hàm băm trong PHP

Bây giờ, hãy thử tay vào một chút mã PHP! PHP cung cấp nhiều hàm built-in cho việc băm. Dưới đây là bảng của các hàm được sử dụng phổ biến nhất:

Hàm Mô tả
md5() Tính toán hash MD5 của một chuỗi
sha1() Tính toán hash SHA-1 của một chuỗi
hash() Tạo một hash giá trị sử dụng nhiều thuật toán
password_hash() Tạo một hash mật khẩu (khuyến nghị cho mật khẩu)
crc32() Tính toán đa thức CRC32 của một chuỗi

Hãy nhìn vào một số ví dụ về cách sử dụng các hàm này:

1. Băm MD5

$string = "Hello, World!";
$md5_hash = md5($string);
echo "MD5 hash of '$string': " . $md5_hash;

Kết quả đầu ra:

MD5 hash of 'Hello, World!': 65a8e27d8879283831b664bd8b7f0ad4

Trong ví dụ này, chúng ta sử dụng hàm md5() để băm chuỗi "Hello, World!". Hash kết quả luôn dài 32 ký tự, không quan trọng đầu vào có độ dài như thế nào.

2. Băm SHA-1

$string = "PHP is awesome!";
$sha1_hash = sha1($string);
echo "SHA-1 hash of '$string': " . $sha1_hash;

Kết quả đầu ra:

SHA-1 hash of 'PHP is awesome!': 4eb40c4bde4d39f32ab9064ec9c93396f6fdcf9f

Hàm sha1() hoạt động tương tự như md5(), nhưng nó tạo ra một hash dài 40 ký tự.

3. Sử dụng hàm hash()

Hàm hash() linh hoạt hơn, cho phép bạn chỉ định thuật toán nào để sử dụng:

$string = "Hashing is fun!";
$algorithms = ['md5', 'sha1', 'sha256'];

foreach ($algorithms as $algo) {
$hash = hash($algo, $string);
echo "Hash of '$string' using $algo: " . $hash . "\n";
}

Kết quả đầu ra:

Hash of 'Hashing is fun!' using md5: 4d6b94ef062847891a1e97a716541059
Hash of 'Hashing is fun!' using sha1: 8a7ced2e4a8d64daa28566150c2add1c04812e53
Hash of 'Hashing is fun!' using sha256: 7b1b6d4c6e48183f2b1b3f2847736fb93339f45e254cb21330f3d0adc3e6d3db

Ví dụ này cho thấy các thuật toán khác nhau tạo ra các hash có độ dài và giá trị khác nhau cho cùng một đầu vào.

4. Băm mật khẩu

Đối với băm mật khẩu, khuyến nghị sử dụng hàm password_hash():

$password = "mySecurePassword123";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
echo "Hashed password: " . $hashed_password;

Kết quả đầu ra:

Hashed password: $2y$10$6Q5DYfJKCsa7C/eV4Wh9OeDjTJ0XLB.Vr7F1C5E6kJRBVWPwMDKP.

Hàm này tự động sử dụng một thuật toán mạnh (hiện tại là bcrypt) và thêm muối (salt) để tăng thêm an toàn.

Để xác minh mật khẩu với hash của nó, sử dụng password_verify():

$password = "mySecurePassword123";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

if (password_verify($password, $hashed_password)) {
echo "Password is correct!";
} else {
echo "Password is incorrect.";
}

Kết quả đầu ra:

Password is correct!

Phương pháp này an toàn hơn nhiều so với việc so sánh hash trực tiếp, vì nó được thiết kế để chống lại các cuộc tấn công theo thời gian.

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới của băm với PHP. Nhớ rằng băm là một quá trình một chiều - bạn không thể "unhash" một hash để lấy lại đầu vào ban đầu. Điều này là gì làm cho nó rất hữu ích cho các mục đích an ninh.

Khi bạn tiếp tục hành trình PHP của mình, bạn sẽ tìm thấy nhiều ứng dụng khác cho băm. Đây là một khái niệm cơ bản trong khoa học máy tính và an ninh mạng, vì vậy việc hiểu nó sẽ rất có lợi cho sự nghiệp lập trình của bạn.

Tiếp tục thực hành, giữ sự tò mò và chúc bạn vui vẻ với việc băm!

Credits: Image by storyset