1. Encode

Encode là chuẩn hoá dữ liệu để có thể truyền tải/lưu trữ trên các hệ thống không hỗ trợ ký tự gốc

Encode không bảo mật, nó có thể đảo ngược 100% (quá trình này gọi là Decode)

Một vài ví dụ về Encode:

  • Base64: Encode nhị phân thành text trong HTTP, chẳng hạn base64 image.
  • URL Encode: biến các ký tự đặc biệt thành %2D, %2F

2. Encrypt

Encrypt là quá trình chuyển dữ liệu gốc (plaintext) thành dạng không đọc được (ciphertext) nhằm bảo vệ thông tin khỏi truy cập trái phép.
Encrypt có thể giải mã được nếu sở hữu key bí mật, quá trình này gọi là Decrypt.

Hai chuỗi giống nhau nếu cùng Encrypt trên cùng một thuật toán và cùng key, thường sẽ cho ra 2 output khác nhau. Điều này là do các thuật toán Encrypt sử dụng IV (Initialization Vector) hoặc các kỹ thuật tạo chuỗi ngẫu nhiên để gây nhiễu.

Dẫn đến là Hacker không thể nào không thể đoán được dữ liệu gốc (plaintext) dựa trên ciphertext.

Một vài ví dụ về Encrypt:

  • HTTPS sử dụng TLS với RSA/AES
  • Dữ liệu nhạy cảm của người dùng (như Email hoặc Phone) sẽ được mã hóa (encrypt) trước khi lưu vào database. Khi backend cần sử dụng dữ liệu, nó sẽ decrypt để lấy lại giá trị gốc.

3. Hash

Hash (băm) là quá trình chuyển dữ liệu sang một chuỗi ký tự cố định, không thể đảo ngược.
Do hash cho ra một chuỗi ký tự cố định (về độ dài), bất kể input như thế nào. Nên vẫn tồn tại xác suất 2 chuỗi input khác nhau, khi được Hash sẽ cho ra output giống nhau.

Một vài ví dụ về Hash:

  • Bcrypt: dùng để hash mật khẩu user và lưu vào database (admin cũng không thể giải mã để lấy mật khẩu được) (MD5 và Sha1 bị CẤM khi dùng để băm mật khẩu)
  • SHA256: dùng để băm bytes của file thành chuỗi 64 ký tự, khi đó các tính năng như kiểm tra file A có giống file B hay không chỉ là bài toán so sánh chuỗi băm.

4. Ứng dụng thực chiến xài Encrypt và Hash

Theo ví dụ ở phần Encrypt:

Dữ liệu nhạy cảm của người dùng (như Email hoặc Phone) sẽ được mã hóa (encrypt) trước khi lưu vào database. Khi backend cần sử dụng dữ liệu, nó sẽ decrypt để lấy lại giá trị gốc.

và mô tả ở Encrypt:

Hai chuỗi giống nhau nếu cùng Encrypt trên cùng một thuật toán và cùng key, thường sẽ cho ra 2 output khác nhau. Điều này là do các thuật toán Encrypt sử dụng IV (Initialization Vector) hoặc các kỹ thuật tạo chuỗi ngẫu nhiên để gây nhiễu.

Điều này có nghĩa là:
Nếu bạn encrypt số điện thoại "0909xxxxxx" hai lần, bạn sẽ nhận được hai ciphertext khác nhau trong database.

Vậy nếu mỗi lần encrypt cùng một số Phone lại tạo ra giá trị khác nhau, làm sao chúng ta có thể thực hiện tính năng đếm số lần xuất hiện của một số điện thoại trong database?

Việc encrypt bảo vệ dữ liệu rất tốt, nhưng vì ciphertext không cố định, nên không thể dùng trực tiếp cột encrypted để tìm kiếm, so sánh hoặc đếm số lần xuất hiện.

Để giải quyết, ta chỉ cần Hash Phone lưu vào một column riêng:

  • Vẫn bảo mật dữ liệu gốc
  • Vẫn tìm kiếm / đếm / unique được theo Phone

By admin

Leave a Reply

Your email address will not be published. Required fields are marked *