Bộ chìa khoá

Tink sử dụng Bộ phím để bật tính năng xoay khoá. Về cơ bản, tập hợp khoá là một danh sách không trống1 gồm các khoá, trong đó một khoá được chỉ định chính (khoá được dùng chẳng hạn để ký và mã hoá văn bản thuần tuý mới). Ngoài ra, các khoá trong tập hợp khoá sẽ nhận được một mã nhận dạng duy nhất2 và trạng thái khoá cho phép tắt các khoá mà không cần xoá các khoá đó khỏi tập hợp khoá.

Bộ khoá là cách chính để người dùng có thể truy cập vào các khoá (thông qua lớp KeysetHandle). Việc này đảm bảo rằng mọi người dùng đều có mã để xử lý nhiều khoá cùng một lúc. Đối với hầu hết người dùng mật mã học, việc xử lý nhiều khoá là điều cần thiết: cần có khả năng thay đổi các khoá (ví dụ: các khoá cũ có thể bị rò rỉ) và hầu như không bao giờ có thao tác "chuyển sang khoá tiếp theo" nguyên tử có thể áp dụng cho các máy mà mã đó chạy và tất cả các thuật toán mật mã trên toàn cầu trong một thời gian ngắn. Do đó, người dùng cần phải viết mã hoạt động khi một phím thay đổi từ một phím sang phím tiếp theo.

Ví dụ: AEAD

Hãy xem xét tập hợp khoá AEAD, chứa nhiều khoá cho dữ liệu gốc AEAD. Như đã giải thích trước đó, mỗi phím chỉ định duy nhất 2 hàm: \(\mathrm{Enc}\) và \(\mathrm{Dec}\). Tập hợp khoá hiện cũng chỉ định 2 hàm mới: \(\mathrm{Enc}\) và \(\mathrm{Dec}\) - \(\mathrm{Enc}\) đơn giản bằng chức năng \(\mathrm{Enc}\) của khoá chính của tập hợp khoá, trong khi hàm \(\mathrm{Dec}\) cố gắng giải mã bằng tất cả các khoá, duyệt qua các khoá đó theo thứ tự nào đó (xem bên dưới để biết cách Tink cải thiện hiệu suất của việc này).

Cần lưu ý rằng Tập hợp phím là khoá đầy đủ: là nội dung mô tả đầy đủ về các hàm \(\mathrm{Enc}\) và\(\mathrm{Dec}\) được sử dụng. Tức là người dùng có thể viết một lớp lấy dữ liệu đầu vào là KeysetHandle, thể hiện ý tưởng rằng lớp đó cần có nội dung mô tả đầy đủ về các đối tượng \(\mathrm{Enc}\) và \(\mathrm{Dec}\) để hoạt động đúng cách. Việc này cho phép người dùng viết các API để thông báo rằng: để sử dụng lớp này, bạn cần cung cấp cho tôi nội dung mô tả về dữ liệu gốc mật mã.

Xoay khoá

Hãy xem xét một người dùng Tink viết một chương trình trước tiên lấy tập hợp khoá từ KMS, sau đó tạo đối tượng AEAD từ tập hợp khoá này và cuối cùng sử dụng đối tượng này để mã hoá và giải mã bản mã hoá.

Người dùng như vậy sẽ tự động được chuẩn bị cho chế độ xoay khoá và chuyển đổi các thuật toán trong trường hợp lựa chọn hiện tại của họ không đáp ứng tiêu chuẩn nữa.

Bạn phải cẩn thận một chút khi triển khai việc xoay khoá như vậy: Trước tiên, KMS phải thêm khoá mới vào tập hợp khoá (nhưng chưa đặt khoá này làm khoá chính). Sau đó, tập hợp khoá mới cần được triển khai cho mọi tệp nhị phân để mọi tệp nhị phân sử dụng tập hợp khoá này đều có khoá mới nhất trong tập hợp khoá. Chỉ khi đó, khoá mới mới được đặt làm khoá chính và tập hợp khoá kết quả được phân phối lại cho tất cả các tệp nhị phân bằng cách sử dụng tập hợp khoá.

Giá trị nhận dạng khoá trong thuật toán mật mã

Hãy xem xét lại ví dụ về tập hợp khoá AEAD. Nếu tóm lại, việc giải mã một thuật toán mật mã đòi hỏi Tink phải cố giải mã bằng tất cả các khoá trong Tập hợp khoá, vì không có cách nào để biết khoá nào được dùng để mã hoá tập hợp khoá đó. Điều này có thể gây ra mức hao tổn hiệu suất lớn.

Do đó, Tink cho phép đặt tiền tố cho bản mật mã bằng một chuỗi 5 byte bắt nguồn từ mã nhận dạng. Theo triết lý "Khoá đầy đủ" ở trên, tiền tố này là một phần của khoá và tất cả thuật toán mật mã từng bắt nguồn từ khoá này đều phải có tiền tố này. Khi tạo khoá, người dùng có thể chọn xem sẽ sử dụng tiền tố đó hay không, hay sẽ sử dụng định dạng văn bản mật mã không có tiền tố đó.

Khi một khoá nằm trong tập hợp khoá, Tink sẽ tính toán thẻ này từ mã nhận dạng mà khoá có trong tập hợp khoá. Trên thực tế, các mã nhận dạng là duy nhất2 trong một tập hợp khoá ngụ ý rằng các thẻ đó là duy nhất. Do đó, nếu chỉ sử dụng các khoá được gắn thẻ, thì sẽ không có tổn thất về hiệu suất so với việc giải mã bằng một khoá duy nhất: Tink chỉ cần thử một trong các khoá khi giải mã.

Tuy nhiên, vì thẻ là một phần của khoá, nên điều này cũng có nghĩa là khoá chỉ có thể nằm trong tập hợp khoá nếu có một mã nhận dạng cụ thể. Điều này có một số ảnh hưởng khi mô tả cách triển khai đối tượng chính bằng các ngôn ngữ khác nhau.


  1. Một số phần của Tink vẫn coi Tập hợp phím là một tập hợp. Tuy nhiên, bạn nên thay đổi điều này. Lý do là thứ tự này nhìn chung rất quan trọng: chẳng hạn như hãy xem xét vòng đời điển hình của thao tác xoay khoá bằng Aead. Trước tiên, một khoá mới sẽ được thêm vào tập hợp khoá. Khoá này chưa được đặt làm khoá chính nhưng đang hoạt động. Bộ khoá mới này đã được phát hành cho tất cả tệp nhị phân. Sau khi mọi tệp nhị phân biết khoá mới, khoá sẽ được đặt làm khoá chính (chỉ tại thời điểm này việc sử dụng khoá này mới an toàn). Ở bước thứ hai này, tính năng xoay vòng khoá cần biết khoá cuối cùng đã được thêm. 

  2. Để tương thích với thư viện nội bộ của Google, Tink cho phép có các bộ khoá chứa các mã nhận dạng lặp lại. Tính năng hỗ trợ này sẽ bị loại bỏ trong tương lai.