Tìm hiểu về giao thức HTTP và HTTPS và các lỗ hổng bảo mật có thể có của nó (p2)

Như ở bài trước chúng ta tìm hiểu :

  • HTTP là giao thức để trình duyệt giao tiếp với web server nhằm đưa các thông tin cơ bản của máy tính và trình duyệt lên server.

  • HTTPS được tạo ra nhằm chống mục đích nghe lén giao tiếp (Man in the middle) nhằm bảo mật các gói tin giữa client và server.

  • HTTPS được mã hóa dựa trên 2 loại mã hóa chính là RSA và AES. RSA dùng để trao đổi key và AES dùng để mã hóa dựa trên public key của bên nhận

Ở bài này, chúng ta sẽ tìm hiểu về RSA và một số cách tấn công cơ bản của RSA.

RSA (Rivest–Shamir–Adleman)

Trong mật mã học, RSA là một thuật toán mật mã hóa khóa công khai. Đây là thuật toán đầu tiên phù hợp với việc tạo ra chữ ký điện tử đồng thời với việc mã hóa. Nó đánh dấu một sự tiến bộ vượt bậc của lĩnh vực mật mã học trong việc sử dụng khóa công cộng. RSA đang được sử dụng phổ biến trong thương mại điện tử và được cho là đảm bảo an toàn với điều kiện độ dài khóa đủ lớn. (Wikipedia)

Các bước mã hóa:

  • Chọn 2 số nguyên tố lớn p và q với p # q, lựa chọn ngẫu nhiên và độc lập.
  • Tính n = p x q
  • Tính giá trị hàm Euler, phi(n) = (p-1) * (q-1)
  • Chọn 1 số ngẫu nhiên e sao cho 1 < e < phi(n) và là số nguyên tố cùng nhau với phi(n)
  • Tìm d sao cho d x e mod phi(n) = 1 Khi đó, chúng ta sẽ có cặp public-key (e, n) và private-key (d, n)

Tấn công RSA với cặp khóa ko đủ bảo mật.

  • Để sử dụng HTTPS, chúng ta cần phải có certificate. Vậy, certiciate là gì ?

Trong mật mã học, nhà cung cấp chứng thực số (tiếng Anh: certificate authority, viết tắt: CA) là thực thể phát hành các chứng thực khóa công khai cho người dùng. Nhà cung cấp chứng thực số đóng vai trò là bên thứ ba (được cả hai bên tin tưởng) để hỗ trợ cho quá trình trao đổi thông tin an toàn. Các nhà cung cấp chứng thực số là thành phần trung tâm trong nhiều mô hình hạ tầng khóa công khai (PKI).

Hiện nay có nhiều CA thương mại mà người dùng phải trả phí khi sử dụng dịch vụ. Các tổ chức và chính phủ cũng có thể có những CA của riêng họ. Bên cạnh đó cũng có những CA cung cấp dịch vụ miễn phí. (wikipedia)

--> Hay nói đơn giản hơn, certificate là cặp public-private key mà đủ lớn và bảo mật để ko bị tấn công do các tổ chức cung cấp.

Vậy, để hiểu certificate đủ bảo mật là như thế nào, chúng ta phải tìm ra các cách tấn công RSA để hiểu được khóa như thế nào là đủ bảo mật.

https://images.viblo.asia/20be5bf6-fa76-4f26-b1fb-a9cf5904287c.jpg

Tấn công Brute force private key.

  • Trong bảo mật và tìm lỗ hổng, brute force attack chưa bao giờ là lỗi thời. Tuy nhiên, có rất nhiều cách để brute force, quan trọng nhất là brute force như thế nào để "nhanh nhất"

  • Như đã biết, public-key và private-key chúng ta có thể tìm được từ n và p, q.

  • Nếu như chúng ta có được n và nếu n nhỏ chúng ta có thể brute force để suy ra p, q. Vì p, q là 2 số nguyên tố tạo nên n nên n chỉ có 2 ước là p và q.

  • Có p và q chúng ta có thể tìm phi(n) = (p-1) x (q-1) và suy ra private-key d = mod_inverse(e, phi(n)).

Note : Để sử dụng tính toán cryptography, chúng ta nên sử dụng python và thư viện num_py của python. Có hỗ trợ các hàm cơ bản như pow, mod_inverse,.... Hoặc nếu sử dụng tính phương trình, hệ phương trình thì có sagemath,....

Install : python -m install numpy

Tấn công nếu public-key e (exponent) quá lớn (Wiener's attack).

  • Như đã biết d x e mod phi(n) = 1 ---> d = mod_inverse(e, phi(n)). Vây d và e tỉ lệ nghịch với nhau, e lớn thì d nhỏ và ngược lại.

Nguồn : https://en.wikipedia.org/wiki/Wiener's_attack

Tấn công nếu public-key e (exponent) quá nhỏ (Coppersmith's attack).

  • Tương tự, nếu e quá nhỏ. Chúng ta cũng có thể sử dụng Coppersmith method để tấn công.

Nguồn : https://en.wikipedia.org/wiki/Coppersmith's_attack

Tấn công nếu p và q quá gần nhau.

  • N = p x q, nếu p và q quá gần nhau, chúng ta có thể sử dụng brute force, với 2 số gần nhau nhân nhau = n. Thì sẽ có 1 số nhỏ hơn căn bậc 2 của n và 1 số lớn hơn căn bậc 2 của n.

  • Từ đó suy ra, chúng ta lấy căn bậc 2 của n rồi từ đó cộng 1 brute force đến khi nào tìm được ước thứ nhất. Sau đó ta sẽ có được ước thứ hai (p, q)

  • Tuy nhiên, có một cách brute force hay hơn là xài định lý fermat

https://images.viblo.asia/e382cb99-9568-4241-a45e-3d2e37c39fdc.png

Nguồn : http://mathsolutions.50webs.com/fermat.html

Kết luận :

  • Các kiểu tấn công trên là các kiểu cơ bản nhất của RSA, dù vẫn có những kiểu tấn công khác chưa đề cập. Nhưng với kiến thức của bản thân, mình rút ra được public key là một cặp (e, n) thỏa mãn các điều kiện :
  • e không quá lớn cũng ko quá nhỏ (đa số sử dụng 65537)
  • n là tích của cặp số nguyên tố ngẫu nhiên mà từ nó ta ko thể tìm được cặp số nguyên tố ước của nó (Có thể sử dụng http://factordb.com/ để check xem số đó đã tìm được ước chưa)

Ở bài tiếp theo, chúng ta sẽ tìm hiểu một số cách tấn công AES cơ bản.