1. Mở đầu

Có 2 hình thức mã hoá dữ liệu là server-side encryption và client-side encryption, server-side encryption là dữ liệu được mã hoá ở phía server, client-side encryption là mã hoá dữ liệu ở phía client.

Trong nhiều trường hợp, bạn cần phải mã hoá dữ liệu phía client trước khi gửi đi đâu đó (client-side encryption), có nhiều thư viện giúp bạn mã hoá dữ liệu bên client và AWS Encryption SDK là một trong số đó.

Bài này mình sẽ giải thích cách hoạt động của AWS Encryption SDK (dưới đây mình sẽ gọi tắt là SDK).

 

Trước hết, bạn phải nắm được một số khái niệm cơ bản sau:

  • data key là khoá để mã hoá và giải mã dữ liệu. SDK sẽ tạo ra một data key cho một hoặc vài lần mã hoá nên có thể có nhiều data key trong quá trình mã hoá nhiều dữ liệu.
  • master key (hay wrapping key) là khoá quản lý để tạo ra data key. Khác với data key có thể có nhiều nhưng master key chỉ có một hoặc một vài mà thôi. Khoá này là bí mật, dù dữ liệu đã mã hoá của bạn có bị bên thứ ba lấy được, nếu họ không có master key này sẽ không thể tạo ra data key để giãi mã dữ liệu đó.
  • keyring (hay master key provider) là bộ phận để tạo ra data key, đây là nơi chứa master key và giữ vai trò tạo ra data key
  • Cryptographic materials manager (CMM) là bộ phận gửi yêu cầu tới keyring để nhận về data key phục vụ cho quá trình mã hoá.

Bạn để ý trong những thứ trên, quan trọng nhất là master key vì nó là khoá bí mật để mã hoá và giải mã dữ liệu. Bạn có thể sử dụng AWS KMS, hoặc RSA key do bạn tự tạo, hoặc thư viện của bên thứ ba để cung cấp master key này.

Nếu sử dụng AWS KMS cho master key, bạn sẽ hoàn toàn yên tâm là khoá bí mật này sẽ không bị mất vì chính bạn cũng không thể nhìn thấy nó. Nó được quản lý bởi AWS KMS và chỉ có thể sử dụng và tham chiếu thông qua Key ID. Tất nhiên nếu bạn để lộ aws credential cho ai đó thì họ cũng có thể gọi tới AWS KMS để lấy data key giải mã dữ liệu của bạn.

 

Dưới đây mình đi vào từng phần là mã hoá và giải mã:

2. Cách AWS Encryption SDK mã hoá dữ liệu

Quá trình mã hoá dữ liệu theo sơ đồ sau:

Cách mã hoá dữ liệu trong aws encryption sdk

  • Bước 1: Từ master key (hay wrapping key) bạn khởi tạo keyring (hay master key provider). Mặc định CMM cũng sẽ được khởi tạo cho bạn, hoặc bạn có thể tạo CMM riêng cho mình nếu muốn.
  • Bước 2: Bạn gọi encryption method cùng với dữ liệu cần mã hóa và keyring khởi tạo ở trên. 
  • Bước 3: Encryption method sẽ yêu cầu CMM gửi request tới keyring để lấy data key. Bạn không thao tác trực tiếp với keyring mà phải thông qua CMM.
  • Bước 4: Keyring sẽ gửi kết quả về cho CMM là một data key ở dạng plaintext (plaintext data key) và một hoặc nhiều data key đã được mã hoá bằng master key (encrypted data keys) (nếu có nhiều master key sẽ có nhiều encrypted data keys). CMM sẽ lấy kết quả này và trả về cho encryption method:

cách aws mã hoá dữ liệu

  • Bước 5: Encryption method sẽ dùng plaintext data key để mã hoá dữ liệu. Sau khi mã hoá dữ liệu thành công, encryption method sẽ xoá plaintext data key, rồi gắn encrypted data keys (và các metadata khác nếu có) vào dữ liệu đã được mã hoá để có kết quả cuối cùng (kết quả này gọi là encrypted message).

 

3. Cách AWS Encryption SDK giải mã dữ liệu

Quá trình giải mã dữ liệu theo sơ đồ sau:

Giải mã dữ liệu trong aws encryption sdk

Từ encrypted message được mã hoá ở phần trên, SDK sẽ thực hiện các bước sau để giải mã dữ liệu:

  • Bước 1: Từ master key (hay wrapping key) bạn khởi tạo keyring (hay master key provider), chú ý là một trong các master key truyền vào ở đây phải trùng với master key sử dụng khi mã hoá. Mặc định CMM cũng sẽ được khởi tạo cho bạn, hoặc bạn có thể tạo CMM riêng cho mình nếu muốn.
  • Bước 2: Bạn truyền encrypted message cùng với keyring tạo ở trên vào decryption method.
  • Bước 3: Decryption method sẽ yêu cầu CMM request tới keyring để lấy data key phục vụ cho việc giải mã. Ở bước này, CMM phải gửi thông tin của encrypted data keys nằm trong encrypted message cho keyring để keyring sử dụng master key giải mã encrypted data keys đó.
  • Bước 4: Sau khi keyring giải mã thành công encrypted data keys, sẽ gửi trả về plaintext data key cho CMM CMM sẽ trả lại kết quả cho decryption method.

Cách aws giải mã dữ liệu

  • Bước 5: Decryption method dùng plaintext data key nhận từ CMM để giải mã encrypted message thành plaintext data.

 

Link tham khảo:

https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/choose-keyring.html#keyring-compatibility

https://docs.aws.amazon.com/kms/latest/developerguide/programming-encryption.html

https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html

https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/how-it-works.html

https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/choose-keyring.html

https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/concepts.html#master-key