Điều quan trọng là Tink phải hoạt động "giống nhau" trong tất cả cá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:
Để duy trì tính nhất quán, Tink sử dụng bài kiểm thử nhiều ngôn ngữ trong kho lưu trữ GitHub nhiều ngôn ngữ. Những 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ư mong đợi. Do đó, trang này cung cấp định nghĩa hoạt động của chúng tôi. Về cơ bản, Tink cung cấp hai kiểu nhất quán:
- Tính nhất quán khi đá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 trong hai ngôn ngữ, thì chúng sẽ hoạt động như nhau.
- Tính nhất quán khi tạo: Việc tạo dữ liệu gốc sẽ thành công trong 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 nêu trong danh sách các loại khoá được hỗ trợ của chúng tôi.
Bối cảnh
Về tổng thể, 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 các khoá mới vào tập hợp khoá, xoá các 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ự tập hợp khoá thành một chuỗi byte và ngược lại phân tích cú pháp tập hợp khoá từ một chuỗi byte.
Tạo gốc: Tink cung cấp API để tạo giao diện cho dữ liệu gốc trong tập hợp khoá. Ví dụ: để tạo đối tượng
Aead
từ một tập hợp khoá trong Java, người dùng sẽ gọikeysetHandle.getPrimitive(Aead.class, config)
.Sử dụng gốc: Giao diện được tạo trong bước tạo gốc cung cấp 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, có thể tạo dữ liệu gốc từ tập hợp khoá này trong ngôn ngữ không?
Đánh giá: Nếu có thể tạo một dữ liệu nguyên gốc bằng một số ngôn ngữ từ một tập hợp khoá nhất định, thì đối tượng nguyên gốc sẽ hoạt động như thế nào?
Điều quan trọng cần lưu ý là Tink không cung cấp tính nhất quán khi phân tích cú pháp một tập hợp khoá. Ví dụ: có thể Tink C++
- phân tích cú pháp thành công các bộ khoá chứa các khoá CHACHA20-POLY1305, mặc dù các thao tác CHACHA20-POLY1305 AEAD không được triển khai trong Tink;
- phân tích cú pháp thành công các bộ khoá bằng các khoá có độ dài 1 byte. Điều này sẽ không thực hiện được 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 khi đánh giá
Tính nhất quán của hoạt động đánh giá quan trọng hơn mọi tính nhất quán trong quá trình tạo: nếu một AEAD trong Java không thể giải mã quá trình mã hoá AEAD trong C++, thì người dùng sẽ gặp một vấn đề nghiêm trọng.
Nói chung, Tink hướng đến sự nhất quán theo cách hiển nhiên đối với các dữ liệu nguyên gốc. Ví dụ: nếu một 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)
dự kiến sẽ thành công.
Tuy nhiên, bạn cần lưu ý một số điều sau. Ví dụ: loại dữ liệu trả về của aead.Encrypt
trong Java là byte[]
.
Theo Quy cách ngôn ngữ Java (JLS) §10.7, độ dài của mảng thuộc loại int
, theo §JLS 4.2.1 có thể tối đa là 2147483647. Do đó, quá trình mã hoá mảng có độ dài 2147483647 không thành công trong Java: quá trình mã hoá có một số hao tổn, nghĩa là dữ liệu đầu ra sẽ quá dài. Tuy nhiên, trong các ngôn ngữ khác, việc mã hoá vẫn cho phép thành công đối với các dữ liệu đầu vào đó.
Do đó, Tink mang đến tính nhất quán đá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 trong hai ngôn ngữ, thì chúng sẽ hoạt động như nhau.
Trường hợp 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 đặc biệt.
Tính nhất quán khi tạo
Việc tạo dữ liệu gốc không phải lúc nào cũng thành công đối với mọi 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 chính có độ dài 128 bit.
Tuy nhiên, Tink cung cấp tính nhất quán như sau: nếu hai ngôn ngữ đều hỗ trợ một loại khoá, thì tập hợp các khoá mà dữ liệu gốc có thể được tạo trùng khớp với nhau. Tất nhiên, nếu một ngôn ngữ không hỗ trợ một loại khoá, thì không thể tạo đối tượng nguyên gốc nào.
Tính nhất quán khi tạo quy tắc không quan trọng hơn tính nhất quán trong đánh giá. Quy tắc này cũng có nhiều ngoại lệ hơn so với tính nhất quán trong đánh giá. Những hạn chế này được nêu trong danh sách các loại khoá được hỗ trợ. Ví dụ: đối với loại khoá ECIES Tink cung cấp lựa chọn về đườ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ó tên làKeysetHandle
trong hầu hết các ngôn ngữ.↩