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. Các API an toàn và đơn giản của Tink giúp giảm bớt tình trạng phổ biến các sai sót qua thiết kế tập trung vào người dùng, triển khai cẩn thận và đánh giá mã, và thử nghiệm mở rộng. Xem phần Mục tiêu trên trang này để thông tin chi tiết hơn 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ật mã triển khai an toàn các công cụ chung các nhiệm vụ mã hoá. Tại Google, Tink đã được triển khai trong hàng trăm sản phẩm và hệ thống.
Vì sao nên dùng Tink?
Sau đây là những lý do quan trọng nhất để sử dụng Tink:
Dễ sử dụng
Mã hoá rất khó để đoán đúng. Với Tink, bạn có thể mã hoá hoặc ký dữ liệu bằng các đảm bảo bảo mật được tích hợp sẵn chỉ bằng một vài dòng mã. Tink cũng có thể giúp bạn thay đổi khoá hoặc khoá an toàn bằ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 để hỗ trợ các thư viện nổi tiếng như BoringSSL và Kiến trúc mã hoá Java và hiển thị chúng ngay trong giao diện, để người kiểm tra và công cụ nhanh chóng tìm ra lỗ hổng. Tink cũng tách riêng các API đều có khả năng gây nguy hiểm nên bạn có thể theo dõi chúng.
Chương trình này 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ó. Tiếng Tink cũng hỗ trợ mã hoá hoặc lưu trữ khoá trong Amazon KMS, Google Cloud KMS, Kho khoá Android và iOS Keychain.
Ai đang sử dụng Tink?
Tink được nhiều công ty sử dụng rộng rãi, trong đó có Google, Square và Thành phố cũng như hàng trăm khách hàng của Google Cloud và đối tác của Google Pay. Cũng tink 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 của 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:
- Tăng cường sự linh hoạt của hoạt động mã hoá: Người dùng có thể thay đổi khoá và các thuật toán quảng cáo một cách đơn giản.
- Hỗ trợ đánh giá bảo mật: Mục tiêu của Tink là cho phép người dùng viết mã có cục bộ có thể xem xét mức độ bảo mật bằng cách cung cấp giao diện thể hiện rõ đảm bảo 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:
- Tink cung cấp các thành phần gốc và giao diện dưới dạng các thành phần trừu tượng quan trọng. Các trừu tượng cho phép người dùng viết mã không chỉ định chính xác được sử dụng, nhưng thay vào đó chỉ định khái niệm bảo mật dự kiến.
- Tink sử dụng khái niệm "keyset", là một tập hợp các khoá được liên kết với một dữ liệu nguyên gốc cụ thể. Điều này dẫn đến việc người dùng phải viết mã Tính năng này hoạt động với nhiều khoá.
- Trong Tink, các khoá không chỉ do tài liệu khoá cơ bản chỉ định mà còn thuật toán mật mã cũng như tất cả tham số. Điều này có nghĩa là một khoá Tink luôn chọn một hàm mật mã duy nhất trong số tất cả có thể tồn tại và không có chỗ để diễn giải.
Các phần sau đây sẽ giải thích các khái niệm này chi tiết hơn.
Tính linh hoạt của mã hoá
Hãy cân nhắc làm việc với Kỹ thuật phần mềm tại Google, một cuốn sách về các bài học rút ra trong lĩnh vực kỹ thuật phần mềm, cùng với có tiêu đề phụ là "các bài học rút ra được từ chương trình theo thời gian". Trong đó, tác giả chuyển đến rất dài để giải thích tác động của việc mọi thứ thay đổi. Chiến dịch này thực tế cũng ảnh hưởng nhiều đến thiết kế của Tink. Trong mật mã học, điều quan trọng là mà mọi người chuẩn bị cho sự thay đổi. Khoá sẽ bị rò rỉ và thuật toán sẽ bị hỏng. Khả năng thay đổi khoá và thuật toán rất quan trọng đối với nhiều người dùng và chuẩn bị là thận trọng.
Đánh giá bảo mật và tài sản địa phương
Tink quảng bá việc sử dụng các giao diện, chẳng hạn như giao diện AEAD của chúng tôi, cho phép người dùng để mã hoá dữ liệu. Ngoài các bảo đảm 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 mật mã.
Để xem cách sử dụng quy trình này, giả sử một kỹ sư muốn lưu trữ một số thông tin nhạy cảm mã nhận dạng trong cookie người dùng. Chúng 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;
};
Khi truyền Aead
, bạn sẽ nhận được các thuộc tính sau:
- Mã này thông báo rằng để
IdEncrypter
thực hiện công việc, mã này yêu cầu lược đồ mã hoá với các thuộc tính bảo mật màAead
cung cấp. Ngoài ra, mộtDeterministicAead
là không đủ --IdEncrypter
yêu cầu hai mã hoá của cùng một id thì khác nhau. Mặt khác, lấy tham số làm phiên bản của trình mã hoá AES GCM (một phiên bản cụ thể củaAead
) sẽ quá tốn kém nghiêm ngặt: mọi Aead đều đủ đểIdEncrypter
thực hiện công việc của nó và không cần phải là một thuật toán cụ thể. - Quá 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 sẽ
không cần phải đi qua toàn bộ kho lưu trữ mã để kiểm tra xem
ở đâu đó, ai đó đã tạo một lớp con của
Aead
không an toàn để sử dụng cùng vớiIdEncrypter
. 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à nhân viên đánh giá có thể kiểm tra để đảm bảo các đối tượng này là đủ.
Đặc biệt, điểm thứ hai đòi hỏi bạn phải hết sức chú ý. Người dùng thường yêu cầu thêm
các thuật toán "không chính xác" Aead
. Điểm trước minh hoạ lý do
điều này thật nguy hiểm: nếu có bất kỳ cách triển khai nào của Aead
không cung cấp các biện pháp đảm bảo bắt buộc về tính bảo mật, IdEncrypter
có thể trở nên không an toàn,
và kỹ sư thực hiện đá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 thực thể chính xác hay không.