Tink là gì?

Tink là một thư viện mật mã nguồn mở do các nhà mật mã học và kỹ sư bảo mật tại Google viết. Các API an toàn và đơn giản của Tink giúp giảm thiểu những lỗi phổ biến thông qua thiết kế lấy người dùng làm trung tâm, xem xét mã và triển khai cẩn thận cũng như kiểm thử rộng rãi. Hãy xem phần Mục tiêu trên trang này để biết thêm thông tin chi tiết về những mục tiêu mà Tink được thiết kế để thực hiện.

Tink giúp người dùng không có nền tảng mã hoá triển khai các tác vụ mã hoá phổ biến một cách an toàn. Tại Google, Tink đã được triển khai trong hàng trăm sản phẩm và hệ thống.

Tại sao nên sử dụng Tink?

Những lý do quan trọng nhất để sử dụng Tink là:

  • Rất dễ sử dụng

    Mật mã học rất khó để chính xác. Với Tink, bạn chỉ cần một vài dòng mã là có thể mã hoá hoặc ký dữ liệu với các tính năng đảm bảo bảo mật tích hợp sẵn. Tink cũng có thể giúp bạn xoay vòng khoá hoặc bảo mật khoá bằng cách sử dụng Hệ thống quản lý khoá bên ngoài (KMS).

  • An toàn

    Tink bổ sung các biện pháp bảo mật cho các thư viện nổi tiếng như BoringSSL và Kiến trúc mật mã Java, đồng thời hiển thị các biện pháp này ngay trên giao diện để người kiểm tra và công cụ có thể nhanh chóng tìm ra lỗ hổng. Tink cũng tách riêng các API có khả năng gây nguy hiểm, để bạn có thể theo dõi các API đó.

  • Tương thích

    Thuật toán mật mã Tink tương thích với các thư viện mật mã học hiện có. Tink cũng hỗ trợ mã hoá hoặc lưu trữ khoá trong Amazon KMS, Google Cloud KMS, Android Keystore và iOS Keychain.

Ai đang sử dụng Tink?

Tink được nhiều công ty sử dụng rộng rãi, bao gồm cả Google, Square và tường thành, cũng như hàng trăm khách hàng của Google Cloud và đối tác của Google Pay. Tink cũng hỗ trợ thư viện Jetpack Security, giúp bảo mật nhiều ứng dụng Android phổ biến như Slack, Adidas, AirBnb và Nextdoor.

Mục tiêu Tink

Mục tiêu chính của Tink so với các thư viện mật mã khác là gì và Tink sử dụng các cơ chế chính nào để đạt được những mục tiêu này?

Tóm lại, Tink có hai mục tiêu:

  1. Tăng cường tính linh hoạt của mật mã: Người dùng có thể thay đổi các khoá và thuật toán theo cách đơn giản.
  2. Cho phép đánh giá bảo mật: Tink hướng đến việc cho phép người dùng viết mã có thể được đánh giá cục bộ về bảo mật, bằng cách cung cấp các giao diện đảm bảo rõ ràng về tính bảo mật.

Sau đây là các cơ chế chính mà Tink sử dụng để đạt được những mục tiêu này:

  1. Tink cung cấp dữ liệu nguyên gốc và giao diện dưới dạng các đối tượng trừu tượng quan trọng. Các mô-đun trừu tượng này cho phép người dùng viết mã không chỉ định thuật toán chính xác sẽ sử dụng, mà chỉ định khái niệm bảo mật dự kiến.
  2. Tink sử dụng khái niệm "tập hợp khoá", là một tập hợp các khoá được liên kết với một nguyên gốc cụ thể. Điều này dẫn đến việc người dùng viết mã tương thích với nhiều khoá.
  3. Trong Tink, các khoá không chỉ được chỉ định theo nội dung khoá cơ bản, mà còn theo thuật toán mật mã cũng như tất cả tham số. Điều này có nghĩa là khoá Tink luôn chọn một hàm mã hoá duy nhất từ tất cả các hàm có thể tồn tại và không có khả năng diễn giải.

Các phần sau đây sẽ giải thích chi tiết hơn về các khái niệm này.

Tính linh hoạt của mật mã

Hãy cân nhắc sử dụng Kỹ thuật phần mềm tại Google, một cuốn sách về những bài học kinh nghiệm trong lĩnh vực kỹ thuật phần mềm, với phụ đề là "các bài học rút ra từ việc lập trình theo thời gian". Trong ví dụ này, các tác giả đã rất nỗ lực để rút ra những ý nghĩa khi mọi thứ thay đổi. Điều này cũng ảnh hưởng nhiều đến thiết kế của Tink. Trong lĩnh vực mật mã học, điều quan trọng là phải chuẩn bị cho thay đổi. Khoá sẽ bị rò rỉ và thuật toán sẽ bị hỏng. Việc có thể thay đổi các khoá và thuật toán là rất quan trọng đối với nhiều người dùng và việc chuẩn bị là điều cần thận trọng.

Đánh giá bảo mật và cơ sở lưu trú tại địa phương

Tink khuyến khích việc sử dụng các giao diện, chẳng hạn như giao diện AEAD, cho phép người dùng mã hoá dữ liệu. Ngoài các đảm bảo bảo mật khác, AEAD đảm bảo rằng nhiều lần mã hoá của cùng một chuỗi sẽ dẫn đến các bản mật mã khác nhau.

Để xem cách sử dụng mã này, giả sử một kỹ sư muốn lưu trữ một số mã nhận dạng nhạy cảm trong cookie của người dùng. Họ có thể cung cấp một lớp như sau:

class IdEncrypter {
  public static IdEncrypter createFromAead(Aead aead);

  public String encrypt(long id) throws GeneralSecurityException;
  public long decrypt(String encrypted) throws GeneralSecurityException;
};

Quá trình truyền Aead sẽ nhận được các thuộc tính sau:

  1. Mã này giao tiếp rằng để IdEncrypter thực hiện công việc của mình, mã này cần có một lược đồ mã hoá với các thuộc tính bảo mật mà Aead cung cấp. Ngoài ra, DeterministicAead là chưa đủ – IdEncrypter yêu cầu 2 quy trình mã hoá cùng một mã nhận dạng khác nhau. Mặt khác, việc lấy tham số làm phiên bản của trình mã hoá AES GCM (một thực thể cụ thể của Aead) sẽ là quá nghiêm ngặt: bất kỳ Aead nào cũng đủ để IdEncrypter thực hiện nhiệm vụ của mình và không cần phải là một thuật toán cụ thể.
  2. Quy trình đánh giá bảo mật có thể tính đến điểm này. Nhân viên đánh giá bảo mật không cần phải xem qua toàn bộ kho lưu trữ mã để kiểm tra xem liệu có phải ai đó đã tạo một lớp con của Aead không an toàn để sử dụng với IdEncrypter hay không. Thay vào đó, Tink cung cấp các thuộc tính bảo mật mà tất cả đối tượng Aead có và người đánh giá có thể kiểm tra xem các thuộc tính này đã đầy đủ chưa.

Đặc biệt, điểm thứ hai đòi hỏi bạn phải quan tâm rất nhiều. Người dùng thường yêu cầu thêm các thuật toán "chưa chính xác" về Aead. Điểm trên đã minh hoạ lý do điều này nguy hiểm: nếu có bất kỳ cách triển khai Aead nào không đảm bảo bảo mật bắt buộc, thì IdEncrypter có thể trở nên không an toàn và kỹ sư thực hiện quy trình đánh giá bảo mật cần kiểm tra mã bổ sung để kiểm tra xem đối tượng có được tạo bản sao đúng cách hay không.