Search…

Cơ Bản về Mã Hóa

22/09/202011 min read
Mạng máy tính là một môi trường mở, những thông tin gửi lên hoặc nhận về từ internet đều có thể bị nghe trộm. Do đó việc bảo mật những thông tin này là cần thiết. Một trong những cách để bảo mật thông tin hữu hiệu nhất hiện nay là mã hóa.

Mã hóa là gì?

Giả sử chưa biết đến mã hóa, 1 hacker chỉ cần làm 1 thiết bị lắng nghe và chuyển đổi các gói packet được truyền đi trong mạng và lắp đặt thiết bị này vào cáp mạng của 1 máy ATM. Khi ai đó sử dụng máy ATM này để chuyển tiền, thiết bị này chỉ việc phân tích các packet chứa thông tin giao dịch được truyền đi, và chuyển đổi số tài khoản muốn gửi thành số tài khoản của anh ta. Và tất cả số tiền giao dịch của máy ATM đó sẽ vào túi của anh ta.

Mã hóa là 1 phương pháp bảo vệ thông tin, bằng cách chuyển đổi thông tin từ dạng rõ (Thông tin có thể dễ dàng đọc hiểu được) sang dạng mờ (thông tin đã bị che đi, để đọc được cần phải giải mã nó).

Giúp bảo vệ thông tin, để những kẻ đánh cắp dù có được thông tin cũng không thể hiểu được nội dung của nó.

  • Ví dụ: Khi muốn gửi thư chứa những thông tin quan trọng không muốn ai biết (Nội dung ban đầu là "Ngày mai xăng tăng giá đó"). Để bảo mật thông tin này, dù cố tình đọc trộm nội dung thì cũng không thể hiểu, thì sẽ mã hóa nó ("fd%$23fDd432FDs4#@Vdserf3%$3"). Khi đưa đến người nhận, bày cho họ cách giải mã để có thể hiểu được nội dung.

Thuật toán mã hóa

Thuật toán mã hóa là 1 thuật toán nhằm mã hóa thông tin, biến đổi thông tin từ dạng rõ sang dạng mờ, để ngăn cản việc đọc trộm nội dung của thông tin.

Thông thường các thuật toán sử dụng 1 hoặc nhiều key (1 chuỗi chìa khóa để mã hóa và giải mã thông tin) để mã hóa và giải mã (Ngoại trừ những thuật toán cổ điển).

Xem key này như 1 password để đọc được nội dung mã hóa. Người gửi sẽ dùng key mã hóa để mã hóa thông tin sang dạng mờ, người nhận sẽ sử dụng key giải mã để giải mã thông tin sang dạng rõ. Chỉ khi có key giải mã mới có thể đọc được nội dung.

Nhưng đôi khi "kẻ thứ ba" (hacker) không có key giải mã vẫn có thể đọc được thông tin, bằng cách phá vỡ thuật toán. Và có 1 nguyên tắc là bất kì thuật toán mã hóa nào cũng đều có thể bị phá vỡ. Do đó không có bất kì thuật toán mã hóa nào được coi là an toàn mãi mãi. Độ an toàn của thuật toán được dựa vào nguyên tắc:

  • Nếu chi phí để giải mã 1 khối lượng thông tin lớn hơn giá trị của khối lượng thông tin đó thì thuật toán đó được tạm coi là an toàn. 
  • Nếu thời gian để phá vỡ 1 thuật toán là quá lớn thì thuật toán được tạm coi là an toàn.

Phân loại các phương pháp mã hóa

Có rất nhiều loại phương pháp mã hóa khác nhau đã ra đời. Mỗi loại có những ưu và nhược điểm riêng. Có thể phân chia các phương pháp mã hóa thành 4 loại chính:

  • Mã hóa cổ điển
  • Mã hóa 1 chiều
  • Mã hóa đối xứng
  • Mã hóa bất đối xứng

Mã hóa cổ điển

Phương pháp mã hóa đầu tiên, cổ xưa nhất, và hiện nay rất ít được dùng đến so với các phương pháp khác.

Ý tưởng của phương pháp này rất đơn giản, bên A mã hóa thông tin bằng thuật toán mã hóa cổ điển, và bên B giải mã thông tin, dựa vào thuật toán của bên A, mà không dùng đến bất kì key nào.

Do đó, độ an toàn của thuật toán sẽ chỉ dựa vào độ bí mật của thuật toán, vì chỉ cần biết được thuật toán mã hóa, sẽ có thể giải mã được thông tin.

Ví dụ: Mã hóa bằng cách thay đổi 1 kí tự trong chuỗi cần mã hóa thành kí tự liền kề (“Di hoc ve” thành “Ek ipd xg”). Thì bất cứ người nào, chỉ cần biết cách mã hóa, đều có thể giải mã được.

Mã hóa 1 chiều

Khái niệm 

Đôi khi chỉ cần mã hóa thông tin chứ không cần giải mã thông tin, khi đó sẽ dùng đến phương pháp mã hóa 1 chiều (Chỉ có thể mã hóa chứ không thể giải mã).

Thông thường phương pháp mã hóa 1 chiều sử dụng 1 hàm băm (hash function) để biến 1 chuỗi thông tin thành 1 chuỗi hash có độ dài nhất định. Không có bất kì cách nào để khôi phục (hay giải mã) chuỗi hash về lại chuỗi thông tin ban đầu.

Hàm băm (Hash function): hàm nhận vào 1 chuỗi có độ dài bất kì, sinh ra 1 chuỗi kết quả có độ dài cố định (chuỗi hash), dù hai chuỗi dữ liệu đầu vào, được cho qua hàm băm thì cũng sinh ra hai chuỗi hash kết quả khác nhau rất nhiều.

  • Ví dụ: Kiểu dữ liệu Hash-table: dạng kiểu dữ liệu mảng đặc biệt mà index nó nhận vào là 1 chuỗi, nó được định nghĩa bằng cách bên trong nó chứa 1 mảng thông thường, mỗi khi truyền vào index là 1 chuỗi, thì chuỗi này sẽ đi qua hàm băm và ra 1 giá trị hash, giá trị này sẽ tương ứng với index thật của phần tử đó trong mảng bên dưới.

Đặc điểm của hash function là khi thực hiện băm hai chuỗi dữ liệu như nhau, dù trong hoàn cảnh nào thì nó cũng cùng cho ra 1 chuỗi hash duy nhất có độ dài nhất định và thường nhỏ hơn rất nhiều so với chuỗi gốc, và hai chuỗi thông tin bất kì dù khác nhau rất ít cũng sẽ cho ra chuỗi hash khác nhau rất nhiều.

Ứng dụng

Do đó hash function thường được sử dụng để kiểm tra tính toàn vẹn của dữ liệu. 

  • Giả sử có 1 file dữ liệu định up lên mạng, muốn kiểm tra xem dữ liệu tải về có chính xác dữ liệu mình upload hay không. Dùng 1 hash function để băm dữ liệu của file đó ra 1 chuỗi hash, gửi kèm cho người dùng chuỗi hash này. Khi đó,  dùng đúng hash function đó để tìm chuỗi hash hiện tại của file tải về, rồi so sánh với chuỗi hash ban đầu, nếu hai chuỗi này giống nhau thì dữ liệu tải về vẫn toàn vẹn.

Ngoài ra có 1 ứng dụng thường thấy là để lưu giữ mật khẩu.

  • Mật khẩu vô cùng quan trọng, do đó không nên lưu mật khẩu của người dùng dưới dạng rõ, nếu bị hacker tấn công, lấy được CSDL thì hacker có thể biết được mật khẩu của người dùng. Do đó, mật khẩu của người dùng nên được lưu dưới dạng chuỗi hash, và đối với server thì chuỗi hash đó chỉnh là “mật khẩu” đăng nhập (lúc đăng nhập thì mật khẩu mà người dùng nhập cũng được mã hóa thành chuỗi hash và so sánh với chuỗi hash trong CSDL của server). Dù hacker có lấy được CSDL thì cũng không thể giải mã được chuỗi hash để tìm ra mật khẩu của người dùng.

Thuật toán mã hóa 1 chiều (hàm băm) thường gặp nhất là MD5SHA.

Mã hóa đối xứng

Khái niệm

Mã hóa đối xứng (mã hóa khóa bí mật) là phương pháp mã hóa mà key mã hóa và key giải mã là như nhau (sử dụng cùng 1 secret key để mã hóa và giải mã).

Đây là phương pháp thông dụng nhất hiện nay dùng để mã hóa dữ liệu truyền nhận giữa hai bên. Vì chỉ cần có secret key là có thể giải mã được, nên bên gửi và bên nhận cần làm 1 cách nào đó để cùng thống nhất về secret key.

Thực hiện

  • Đầu tiên bên gửi và bên nhận bằng cách nào đó sẽ phải thỏa thuận secret key (khóa bí mật) được dùng để mã hóa và giải mã. Vì chỉ cần biết được secret key này thì bên thứ ba có thể giải mã được thông tin, nên thông tin này cần được bí mật truyền đi (bảo vệ theo 1 cách nào đó).
  • Sau đó bên gửi sẽ dùng 1 thuật toán mã hóa với secret key tương ứng để mã hóa dữ liệu sắp được truyền đi. Khi bên nhận nhận được sẽ dùng chính secret key đó để giải mã dữ liệu.

Vấn đề lớn nhất của phương pháp mã hóa đối xứng là làm sao để “thỏa thuận” secret key giữa bên gửi và bên nhận, vì nếu truyền secret key từ bên gửi sang bên nhận mà không dùng 1 phương pháp bảo vệ nào thì bên thứ ba cũng có thể dễ dàng lấy được secret key này.

Các thuật toán mã hóa đối xứng thường gặp: DES, AES…

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

Khái niệm

Mã hóa bất đối xứng (mã hóa khóa công khai) là phương pháp mã hóa mà key mã hóa (public key – khóa công khai) và key giải mã (private key – khóa bí mật) khác nhau.

Key sử dụng để mã hóa dữ liệu sẽ khác với key dùng để giải mã dữ liệu. Tất cả đều có thể biết được public key (kể cả hacker), và có thể dùng public key này để mã hóa thông tin. Nhưng chỉ người nhận nắm giữ private key, nên chỉ có người nhận mới có thể giải mã được thông tin.

Thực hiện 

  • Bên nhận sẽ tạo ra 1 gặp khóa (public key và private key). Bên nhận sẽ dữ lại private key và truyền cho bên gửi public key. Vì public key này là công khai nên có thể truyền tự do mà không cần bảo mật.
  • Bên gửi trước khi gửi dữ liệu sẽ mã hóa dữ liệu bằng thuật toán mã hóa bất đối xứng với key là public key từ bên nhận.
  • Bên nhận sẽ giải mã dữ liệu nhận được bằng thuật toán được sử dụng ở bên gửi, với key giải mã là private key.

Điểm yếu lớn nhất của mã hóa bất đối xứng là tốc độ mã hóa và giải mã rất chậm so với mã hóa đối xứng, nếu dùng mã hóa bất đối xứng để mã hóa dữ liệu truyền – nhận giữa hai bên thì sẽ tốn rất nhiều chi phí.

Ứng dụng chính của mã hóa bất đối xứng là dùng để bảo mật secret key cho mã hóa đối xứng: Dùng phương pháp mã hóa bất đối xứng để truyền secret key của bên gửi cho bên nhận. Và hai bên sẽ dùng secret key này để trao đổi thông tin bằng phương pháp mã hóa đối xứng.

Thuật toán mã hóa bất đối xứng thường thấy: RSA.

Ứng dụng

Khi cần bảo mật thông tin truyền đi giữa các ứng dụng chat, hoặc các ứng dụng có truyền nhận thông tin bí mật giữa client-server, có thể sử dụng kết hợp phương pháp mã hóa bất đối xứng và phương pháp mã hóa đối xứng để đảm bảo dữ liệu đó sẽ được bảo mật.

Dùng phương pháp mã hóa bất đối xứng để truyền secret key từ bên gửi cho bên nhận, và dùng key này để mã hóa, giải mã thông tin.

Thực hiện theo quy trình sau:

  • Bên nhận sinh ra cặp khóa public key và private key (dùng để mã hóa secret key của bên gửi) và gửi cho bên gửi 1 cách công khai, không cần bảo mật.
  • Bên gửi sinh ra 1 secret key (dùng để mã hóa dữ liệu), mã hóa secret key này bằng thuật toán mã hóa bất đối xứng với key mã hóa là public key của bên nhận, sau đó truyền cho bên nhận.
  • Bên nhận nhận dữ liệu và giải mã nó bằng thuật toán mã hóa bất đối xứng được sử dụng ở bên gửi, với key giải mã là private key. Khi đó sẽ ra được secret key dùng để mã hóa dữ liệu.
  • Sau đó mỗi khi cần truyền dữ liệu thì bên gửi sẽ mã hóa dữ liệu đó bằng secret key trước khi gửi, và bên nhận cũng sẽ giải mã dữ liệu bằng secret key đó.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024