Điều quan trọng là Tink phải hoạt động "giống nhau" trong tất cả ngôn ngữ lập trình. Khái niệm này không đơn giản, nhưng quan trọng nhất là:
Để duy trì tính nhất quán, Tink sử dụng các bài kiểm thử đa ngôn ngữ có trong kho lưu trữ GitHub đa ngôn ngữ. Các bài kiểm thử này xác minh tính nhất quán và khả năng tương tác của nhiều ngôn ngữ.
Tuy nhiên, việc xác định tính nhất quán không đơn giản như người ta mong đợi. Do đó, trang này cung cấp định nghĩa thực tế của chúng tôi. Về cơ bản, Tink cung cấp hai loại tính nhất quán:
- Tính nhất quán trong việc đánh giá: Đối với một tập hợp khoá nhất định1, nếu việc tạo dữ liệu gốc thành công bằng hai ngôn ngữ, thì chúng sẽ hoạt động giống nhau.
- Tính nhất quán khi tạo: Việc tạo một dữ liệu gốc sẽ thành công bằng một ngôn ngữ nếu ngôn ngữ đó hỗ trợ tất cả các loại khoá trong một tập hợp khoá, như được ghi lại trong danh sách các loại khoá được hỗ trợ.
Ngữ cảnh
Nhìn chung, Tink cung cấp các API sau:
Thao tác với tập hợp khoá: Tink cung cấp các API để thêm khoá mới vào tập hợp khoá, xoá khoá khỏi tập hợp khoá và thay đổi khoá chính trong tập hợp khoá.
Chuyển đổi tuần tự tập hợp khoá: Tink cung cấp các API để chuyển đổi tuần tự một tập hợp khoá thành một chuỗi byte và ngược lại, phân tích cú pháp một tập hợp khoá từ một chuỗi byte.
Tạo dữ liệu gốc: Tink cung cấp một API để tạo giao diện cho dữ liệu gốc từ một tập hợp khoá. Ví dụ: để tạo một đối tượng
Aeadtừ một tập hợp khoá trong Java, người dùng gọikeysetHandle.getPrimitive(config, Aead.class).Sử dụng dữ liệu gốc: Giao diện được tạo trong bước tạo dữ liệu gốc cung cấp một API để thực hiện các thao tác mã hoá.
Có hai câu hỏi quan trọng cần đặt ra về các API này:
Tạo: Đối với một tập hợp khoá, ngôn ngữ và dữ liệu gốc được chuyển đổi tuần tự nhất định, bạn có thể tạo dữ liệu gốc từ tập hợp khoá này bằng ngôn ngữ đó không?
Đánh giá: Nếu một dữ liệu gốc có thể được tạo bằng một ngôn ngữ nào đó từ một tập hợp khoá nhất định, thì đối tượng dữ liệu gốc sẽ hoạt động như thế nào?
Điều quan trọng cần lưu ý là Tink không đảm bảo tính nhất quán khi phân tích cú pháp một tập hợp khoá. Ví dụ: Tink C++ có thể
- phân tích cú pháp thành công các tập hợp khoá chứa khoá CHACHA20-POLY1305, mặc dù các thao tác AEAD CHACHA20-POLY1305 không được triển khai trong Tink;
- phân tích cú pháp thành công các bộ khoá có khoá có độ dài 1 byte, điều này sẽ không thành công trong tất cả các thao tác mã hoá.
Những hành vi này có thể thay đổi trong các phiên bản nhỏ.
Tính nhất quán của kết quả đánh giá
Tính nhất quán của việc đánh giá quan trọng hơn bất kỳ tính nhất quán nào trong quá trình tạo: nếu AEAD trong Java không thể giải mã quá trình mã hoá của AEAD trong C++, thì người dùng sẽ gặp phải vấn đề nghiêm trọng.
Nhìn chung, Tink hướng đến việc nhất quán theo cách rõ ràng cho các dữ liệu gốc. Ví dụ: nếu tệp nhị phân C++ tính toán chữ ký bằng public_key_sign->Sign(data), thì lệnh gọi xác minh Java tương ứng publicKeyVerify.verify(signature, data) sẽ thành công.
Tuy nhiên, ngay cả trong trường hợp này, vẫn có một số lưu ý. Ví dụ:
kiểu dữ liệu trả về của aead.Encrypt trong Java là byte[].
Theo Đặc tả ngôn ngữ Java (JLS) §10.7, độ dài của một mảng thuộc loại int, theo §JLS 4.2.1, có thể tối đa là 2147483647. Do đó,
việc mã hoá một mảng có độ dài 2147483647 sẽ không thành công trong Java: quá trình mã hoá
có một số hao tổn, nghĩa là
kết quả đầu ra sẽ quá dài. Tuy nhiên, trong các ngôn ngữ khác, việc mã hoá
được phép thành công đối với các dữ liệu đầu vào như vậy.
Do đó, Tink cung cấp tính nhất quán trong việc đánh giá: Đối với một tập hợp khoá nhất định, nếu việc tạo dữ liệu gốc thành công bằng hai ngôn ngữ, thì chúng sẽ hoạt động giống nhau.
Ngoại lệ là một số thao tác có thể không thành công trong một số trường hợp ngoại lệ.
Tính nhất quán trong việc sáng tạo
Không phải lúc nào cũng có thể tạo dữ liệu gốc cho tất cả các tập hợp khoá. Ví dụ: Tink không cho phép người dùng tạo AesSivKey nếu tài liệu khoá có độ dài 128 bit.
Tuy nhiên, Tink đảm bảo tính nhất quán như sau: nếu cả hai ngôn ngữ đều hỗ trợ một loại khoá, thì tập hợp khoá mà dữ liệu gốc có thể tạo sẽ trùng khớp. Tất nhiên, nếu một ngôn ngữ không hỗ trợ loại khoá, thì không thể tạo đối tượng gốc.
Tính nhất quán khi tạo ít quan trọng hơn tính nhất quán khi đánh giá và có nhiều trường hợp ngoại lệ đối với quy tắc này hơn so với tính nhất quán khi đánh giá. Những hạn chế này được ghi lại trong danh sách các loại khoá được hỗ trợ. Ví dụ: đối với loại khoá ECIES, Tink cho phép chọn đường cong elip để sử dụng cho thoả thuận khoá, nhưng Java không hỗ trợ X25519. Do đó, việc tạo khoá bằng X25519 trong Java sẽ không thành công.
-
Trong tài liệu này, chúng tôi sử dụng thuật ngữ
Keysetđể biểu thị đối tượng được gọi làKeysetHandletrong hầu hết các ngôn ngữ. ↩