Điểm qua các cách thức băm và mã hóa dữ liệu

Tôi điểm qua 3 phần chính là các giải thuật băm dữ liệu, mã hóa đối xứng và mã hóa bất đối xứng

Băm

Băm không phải là mã hóa nhưng nó là một thao tác rất cơ bản thường xuyên được dùng trong các thao tác mã hóa dữ liệu. Thuật toán băm cho phép ta tạo ra mã băm từ một khối dữ liệu với các đặc tính:

  • độ dài đầu ra cố định với mỗi thuật toán
  • khối dữ liệu đầu vào giống nhau thì mã băm giống nhau
  • khi biết mã băm rất khó (trong thực tế gần như không thể) tìm ra được khối dữ liệu ban đầu
  • hai khối dữ liệu gần giống nhau thì tạo ra 2 mã băm tương đối khác nhau

Trong lập trình web, tôi thường dùng hàm băm để tạo ra mã băm cho mật khẩu của người dùng. Thay vì lưu trữ password dạng clear text trong cơ sở dữ liệu, tôi lưu trữ mã băm của nó để nhỡ dữ liệu trong CSDL bị rò rỉ thì người dùng cũng không bị lộ mật khẩu. Còn việc kiểm tra khi người dùng đăng nhập thì đơn giản tôi băm mật khẩu do người dùng cung cấp và so sánh với mã băm trong CSDL.

Hashing - băm

 
Các giải thuật thường dùng:

  • CRC32 (Cyclic Redundancy Check): mã băm dài 32 bit
  • MD5 (Message Digest algorithm 5): mã băm dài 128 bit
  • SHA1 (Secure Hashing Algorithm): mã băm dài 160 bit
  • SHA256 (Secure Hashing Algorithm): mã băm dài 256 bit
  • SHA384 (Secure Hashing Algorithm): mã băm dài 384 bit
  • SHA512 (Secure Hashing Algorithm): mã băm dài 512 bit

 

Mã hóa đối xứng

Là phương pháp mã hóa sử dụng cùng một khóa (key) để mã hóa và giải mã. Phương pháp mã hóa này tương đối nhanh nhưng có nhược điểm là 2 bên phải tin tưởng nhau, nguy cơ mất an toàn khi bị lộ khóa (key) trong quá trình chuyển khóa cho đối tác. Khi khóa bị lộ, mọi dữ liệu mã hóa bởi khóa này đều có thể bị giải mã. Phương pháp này phù hợp với các trường hợp cần mã hóa dữ liệu lớn, cần tốc độ nhanh và có khả năng trao đổi khóa an toàn.

Mã hóa đối xứng

 
Các phương pháp thường gặp:

  • Ceasar: quay vòng bộ ký tự
  • DES (Data Encryption Standard): hỗ trợ với khóa dài 64 bit
  • RC2 (Rivest Cipher 2): hỗ trợ với khóa dài từ 40 đến 128 bit
  • AES (Advanced Encryption Standard): hỗ trợ với khóa dài 128, 192 hoặc 256 bit. Còn được gọi với tên là Rijndael
  • TripleDES: hỗ trợ khóa dài 128 hoặc 192 bit. Còn được gọi là 3DES

 

Mã hóa bất đối xứng

Là phương pháp mã hóa dựa trên cặp khóa (công khai và bí mật) của đối tượng mã hóa và đối tượng giải mã. Khóa công khai được đối tượng đưa lên môi trường public (internet chẳng hạn) còn khóa bí mật được đối tượng giữ bí mật cho riêng mình. Việc mã hóa dữ liệu sử dụng một trong hai khóa và việc giải mã dữ liệu sẽ dùng khóa còn lại. Ví dụ: sử dụng khóa công khai của đối tượng giải mã để mã hóa dữ liệu, như vậy chỉ có đối tượng giải mã mới có khóa bí mật của họ để giải mã dữ liệu. Phương pháp này khắc phục được nhược điểm về khả năng mất an toàn khi chuyển khóa như trong mã hóa đối xứng nhưng có nhược điểm là rất chậm. Thông thường thì phương pháp này ít áp dụng với dữ liệu lớn hơn 1kB.

Mã hóa bất đối xứng

 
Giải thuật thường gặp: RSA
 

Kết hợp mã hóa đối xứng và bất đối xứng để tăng hiệu năng

Để khắc phục nhược điểm về hiệu năng và tận dụng được khả năng an toàn của mã hóa bất đối xứng. Ta kết hợp 2 phương pháp mã hóa trên.
Mã hóa bất đối xứng được dùng khi chuyển phát khóa (thường không lớn hơn 1kB). Khóa này được dùng để mã hóa dữ liệu bằng phương pháp mã hóa đối xứng –> vừa an toàn khi chuyển khóa, vừa nhanh khi mã hóa và giải mã.
 

Phòng chống giả mạo, chữ ký điện tử

Mã hóa bất đối xứng có thể gặp phải nguy cơ bảo mật là đối tượng giả mạo tự nhận là đối tượng mã hóa, thực hiện đầy đủ các bước như trên (lấy khóa công khai của đối tượng giải mã để chuyển khóa đối xứng, dùng khóa đối xứng để mã hóa dữ liệu). Đối tượng giải mã không có cách nào để xác định dữ liệu đúng là của đối tượng mã hóa gửi cho không!

Giải pháp:
Đối tượng mã hóa thực hiện các bước sau để ghi danh của mình lên khối dữ liệu:

  • Băm khối dữ liệu để lấy mã băm
  • Dùng khóa bí mật của mình để mã hóa mã băm tạo thành chữ ký (chỉ duy nhất đối tượng mã hóa tạo được chữ ký này, ai cũng có thể giải mã để đọc chữ ký này)
  • Tạo khóa đối xứng, mã hóa khóa đối xứng bằng khóa công khai của đối tượng giải mã (chỉ đối tượng giải mã mới giải mã được)
  • Dùng khóa đối xứng vừa tạo ra để mã hóa khối dữ liệu
  • Đóng gói toàn bộ dữ liệu (chữ ký, khóa đối xứng đã được mã hóa, dữ liệu đã được mã hóa) và gửi cho đối tượng giải mã

 
Đối tượng giải mã sau khi nhận được dữ liệu sẽ thực hiện các bước sau:

  • Dùng khóa bí mật của mình giải mã lấy khóa đối xứng
  • Dùng khóa đối xứng giải mã dữ liệu
  • Băm dữ liệu để lấy mã băm
  • Giải mã chữ ký bằng khóa công khai của đối tượng mã hóa để lấy mã băm ở nguồn
  • So sánh mã băm ở nguồn với mã băm dữ liệu: nếu giống nhau thì dữ liệu không bị thay đổi và đúng là đối tượng mã hóa, trái lại, dữ liệu không toàn vẹn hoặc không đúng của đối tượng mã hóa