Hệ thống mật mã: Phần 3 - Tính toàn vẹn và tính xác thực

Trong phần thứ 3 này, chúng ta sẽ cùng tìm hiểu về các vấn đề sau:

  • Cryptographic Hashes (mật mã hàm băm)
  • Integrity with MD5 and SHA-1 (hàm băm MD5 và SHA-1)
  • Authenticity with HMAC (xác thực bằng HMAC)
  • Key Management (Quản lý khóa)

Các thuật ngữ được dùng trong bài:

  1. Hash function: hàm băm
  2. Message: dữ liệu nhị phân
  3. Message digest/hash value/digest/fingerprint: kết quả hàm băm
  4. Digital fingerprint: dấu vân tay số (điểm chỉ số)
  5. Digital signature: chữ ký số
  6. Key length: độ dài khóa
  7. Keyspace: không gian khóa (số lượng khóa có thể có)
  8. Secret key: khóa bí mật (chỉ cấp cho bên truyền và bên nhận)
  9. Symmetric keys: khóa đối xứng
  10. Asymmetric keys: khóa bất đối xứng

1. Cryptographic Hashes

Một hàm hash với đầu vào là dữ liệu nhị phân (còn gọi là message) tùy ý và cho kết quả là một chuỗi bit có độ dài cố định (còn gọi là message digest hoặc hash value). Là hàm toán học một chiều, hàm hash tương đối dễ tính toán nhưng rất khó để giải ngược. Một ví dụ tương tự là việc xay coffee. Xay nhỏ hạt thì rất dễ nhưng gần như là không thể làm cho bột biến trở lại thành hạt coffee.

Hàm hash được sử dụng để kiểm tra tính toàn vẹn của dữ liệu. Nó cũng được dùng để đánh giá tính xác thực.

Hàm hash tương tự với hàm checksum (CRC) nhưng có tính mật mã cao hơn. Với một giá trị CRC, chúng ta có thể dễ dàng tìm thấy nhiều mẫu dữ liệu và cho ra cùng một kết quả checksum. Với hàm hash, nếu tham số đầu vào khác nhau thì sẽ cho ra kết quả khác nhau. Mỗi khi dữ liệu bị thay đổi thì hash value sẽ thay đổi. Vì lý do này, hash value còn gọi là digital fingerprint. Hash value cũng được dùng để phát hiện ra các tệp dữ liệu trùng lặp, phiên bản dữ liệu thay đổi …Nó cũng được dùng để đảm bảo là dữ liệu không bị thay đổi ngẫu nhiên hoặc cố tình.

Cryptographic Hashes

Hàm hash được sử dụng trong nhiều trường hợp khác nhau, như:

  • Cung cấp bằng chứng xác thực khi kết hợp với symmetric secret authentication key, ví dụ: IP Security, xác thực giao thức định tuyến
  • Cung cấp tính năng xác thực một lần và một chiều như với PPP Challenge Handshake Authentication Protocol (CHAP)
  • Cung cấp bằng chứng về tính toàn vẹn khi triển khai các ứng dụng có dùng chữ ký số.

Về mặt toán học, hàm hash H(x)=h cần có các đặc điểm sau:

  • Tham số đầu vào có độ dài tùy ý
  • Kết quả đầu ra có độ dài cố định
  • H(x) là tương đối dễ tính toán với x tùy ý
    H(x) là hàm một chiều và không thể đảo ngược (nghĩa là biết h nhưng không tìm ra x)
  • H(x) là không xung đột (collision free), nghĩa là với 2 tham số đầu vào khác nhau thì sẽ cho kết quả khác nhau

Cách dùng hàm hash

Hàm hash rất hiệu quả khi dùng kiểm tra dữ liệu không bị thay đổi ngẫu nhiên, nhưng nó không thể đảm bảo là dữ liệu không bị thay đổi cố tình. Ví dụ: Alice truyền dữ liệu (M) cho Bob. Để đảm bảo dữ liệu không bị thay đổi, Alice thực hiện băm dữ liệu H(M)=h và gửi kèm giá trị này với M. Bên Bob, khi nhận được dữ liệu sẽ băm lại H(M)=x và so sánh “x” với giá trị “h” gửi kèm. Nếu x=h thì M không bị thay đổi trong khi truyền. Tuy nhiên, giả sử có một attacker đứng giữa Alice – Bob và đánh cắp dữ liệu. Attacker biến đổi Mà M’, băm lại giá trị này H(M’)=h’ và gửi cặp (M’,h’) sang cho Bob.

Phía nhận tính toán lại, H(M’)=x’ và so sánh với “h’”. Kết quả trùng nhau. Điều này có nghĩa là Bob kiểm tra và không thấy dữ liệu bị thay đổi trong hoạt động truyền (từ attacker) nhưng lại không phát hiện ra dữ liệu đã bị thay đổi so với gốc (từ Alice). Đây chính là thiếu “tính xác thực” trong hoạt động truyền.

Hash được dùng trong rất nhiều trường hợp

Có hai hàm băm nổi tiếng là:

  • Message Digest 5 (MD5) with 128-bit digests
  • Secure Hash Algorithm 1 (SHA-1) with 160-bit digests

2. Tính toàn vẹn với MD5 và SHA-1

2.1. MD5

Ron Rivest phát minh ra MD5 năm 1991. Về cơ bản MD5 là một chuỗi phức tạp của các phép toán nhị phân đơn giản, như OR và phép quay, và cho kết quả là chuỗi 128 bit. Thuật toán chính dựa trên hàm nén các khối dữ liệu. Đầu vào là data block cộng với feedback của block trước. Block 512 bit được chia thành 16 sub-block 32 bit. Các block này được sắp xếp lại bằng phép toán lặp gồm 4 vòng. Kết quả là một tập 4 block 32 bit nối tiếp nhau và tạo thành 128 bit hash value.

Thuật toán MD5

MD5 dựa trên MD4 (đã bị phá vỡ) và bị xem như kém an toàn hơn so với SHA-1.

2.2. SHA

National Institute of Standards and Technology (NIST) đã phát minh ra Secure Hash Algorithm (SHA) và công bố SHA-1 vào năm 1994. Về thiết kế, SHA-1 rất giống với MD4, MD5. Thuật toán SHA-1 băm dữ liệu đầu vào có kích thước nhỏ hơn 2^26 bit và tạo ra 160-bit message digest. Thuật toán này hơi chậm hơn so với MD5 nhưng cho giá trị digest lớn hơn nên bảo mật hơn (đối với các kiểu tấn công brute-force và giải ngược).

NIST đã đưa ra 4 phiên bản hàm SHA với giá trị digest lớn hơn:

  • SHA-224 (224 bit)
  • SHA-256 (256 bit)
  • SHA-384 (384 bit)
  • SHA-512 (512 bit)

Bốn phiên bản này được xem như SHA-2 (mặc dù chưa được tiêu chuẩn hóa). NIST cũng đã phát triển thuật toán SHA-3 có tính bảo mật cao hơn và sẽ thay thế cho SHA-1, SHA-2.

Thuật toán SHA

3. Authenticity HMAC

Trong mật mã học, keyed-hash message authentication code (HMAC hoặc KHMAC) là một kiểu của message authentication code (MAC). HMAC được tính toán bằng cách sử dụng một hàm hash cùng với secret key (là key chỉ có sender và receiver biết). Bây giờ, chúng ta có hàm hash như sau: H(M,K)=h, trong đó M là message (dữ liệu cần băm) và K là secret key. Với việc dùng thêm secret key, hàm HMAC cung cấp thêm tính năng xác thực nguồn tin và có thể chống lại man-in-the-middle attack.

Thuật toán HMAC

Chúng ta xem lại ví dụ “Alice truyền dữ liệu (M) cho Bob”. Để đảm bảo dữ liệu toàn vẹn và thêm tính năng xác thực bằng cách dùng secret key (K), Alice thực hiện băm dữ liệu H(M,K)=h và gửi kèm giá trị này với M. Bên Bob, khi nhận được dữ liệu sẽ băm lại H(M,K)=x và so sánh “x” với giá trị “h” gửi kèm. Nếu x=h thì M không bị thay đổi trong khi truyền.

Giả sử có một attacker đứng giữa Alice – Bob và đánh cắp dữ liệu nhưng không biết secret key (K). Attacker biến đổi Mà M’, băm lại giá trị này H(M’,K’)=h’ và gửi cặp (M’,h’) sang cho Bob. Phía nhận tính toán lại, H(M’,K)=x’ và so sánh với “h’”. Kết quả khác nhau vì tập đầu vào (M’,K) phía Bob khác với (M’,K’) phía attacker. Điều này chứng tỏ dữ liệu bị thay đổi và không phải do Alice gửi.

Các bạn tham khảo thêm ví dụ sau:

Ví dụ thuật toán HMAC

Giao thức IP Security trong triển khai VPN sử dụng hàm HMAC để cung cấp tính năng xác thực nguồn tin và kiểm tra toàn vẹn dữ liệu.

4. Key Management

Quản lý khóa là phần khó nhất khi thiết kế hệ thống mật mã. Trong thực tế, hầu hết các tấn công hệ thống mật mã là nhằm đến mức quản lý khóa chứ không phải hướng đến bản thân thuật toán mã hóa.

Key Management có các đặc điểm cơ bản sau:

  • Generation (sinh/tạo khóa): trong hệ thống mật mã hiện đại, việc sinh key được thực hiện tự động chứ không phải do người dùng thực hiện. Người ta sử dụng bộ tạo số ngẫu nhiên để attacker khó dự đoán.
  • Verification (kiểm tra): hầu hết các thuật toán mã hóa đều có các key không an toàn. Bằng chức năng kiểm tra khóa, các key này có thể tạo lại để đảm bảo an toàn hơn.
  • Storage (lưu trữ): trong hệ điều hành multi-user, một key có thể được lưu trữ trong bộ nhớ. Đây là một lỗ hổng bảo mật khi mà dữ liệu từ bộ nhớ được ghi vào ổ cứng và một chương trình Trojan Horse có thể đánh cắp private key.
  • Exchange (trao đổi): nên cung cấp một cơ chế trao đổi key an toàn, ngay cả khi truyền qua hạ tầng mạng không tin cậy.
  • Revocation and Destruction (thu hồi và phá hủy): các key bị thu hồi cần được thông báo tới các bên sử dụng. Việc loại bỏ các key cũ cũng là một biện pháp ngăn chặn tấn công.

Thu hồi và phá khủy khóa

Có 2 khái niệm dùng để mô tả key là key length (độ dài khóa, đo bằng bit) và keyspace (không gian khóa, số lượng key có thể tạo ra). Khi tăng key length thì keyspace tăng theo cấp số nhân. Ví dụ:

  • key length = 2-bit à keyspace = 4 (2^2), và có 4 key (00, 01, 10, and 11).
  • key length = 3-bit à keyspace = 8 (2^3), có 8 keys (000, 001, 010, 011, 100, 101, 110, 111).
  • key length = 4-bit, keyspace = 16.
  • key length = 40-bit, keyspace = 1,099,511,627,776.

Một key có độ dài n bits thì có keyspace là 2^n. Nếu thêm 1 bit vào key thì keyspace tăng lên gấp đôi. Các bạn xem ví dụ sau:

Ví dụ key length

Có một vài kiểu key mã hóa sau:

  • Symmetric keys, ví dụ dùng trong VPN
  • Asymmetric keys, thường dùng trong HTTPs
  • Digital signatures, thường dùng trong kết nối đến website bảo mật
  • Hash keys, thường dùng để tạo Symmetric keys và Asymmetric keys …

Với một thuật toán mã hóa tin cậy, attacker chỉ có thể dò tìm key bằng tấn công brute-force. Kiểu tấn công này yêu cầu phải tìm kiếm toàn bộ keyspace và attacker có thể thành công khi dò tìm được 50% keyspace. Do đó việc lựa chọn độ dài key thích hợp là yếu tố rất quan trọng.

Ví dụ về việc chọn độ dài key thích hợp

Phần 3 kết thúc tại đây, hẹn gặp lại các bạn trong phần tiếp theo.

Thứ Năm, 16/06/2022 19:45
4,33 👨 1.951
0 Bình luận
Sắp xếp theo
    ❖ Kiến thức cơ bản