Sử dụng Tink để đáp ứng các yêu cầu về bảo mật theo FIPS 140-2

Bản thân Tink không được FIPS 140-2 xác thực. Tuy nhiên, API này hỗ trợ một số thuật toán được phê duyệt theo FIPS 140-2 và các phương thức triển khai cơ bản có thể sử dụng các mô-đun mật mã đã được xác thực như BoringSSLs BoringCrypto. Tink bao gồm một WORKSPACE để xây dựng BoringSSL ở chế độ FIPS.

Hãy lưu ý rằng không gian làm việc vốn không đảm bảo rằng việc bạn sử dụng BoringSSL sẽ tuân thủ FIPS. Bạn nên đọc chính sách bảo mật chính thức của BoringCrypto.

Các thuật toán được hỗ trợ

Các thuật toán sau đây trong Tink được phê duyệt theo FIPS 140-2 (xem thêm thông tin tại FIPS 140-2 Phụ lục A):

  • Mã hoá xác thực
    • AES-GCM
    • AES-CTR-HMAC-SHA256
  • MAC
    • HMAC-SHA256
    • AES-CMAC
  • Chữ ký số
    • ECDSA
    • RSA-SSA-PKCS1
    • RSA-SSA-PSS

Chế độ chỉ FIPS trong C++

Nếu bắt buộc phải sử dụng các thuật toán được phê duyệt và các phương thức triển khai đã xác thực của FIPS 140-2, thì bạn có thể tạo Tink ở chế độ chỉ có FIPS. Điều này hạn chế việc sử dụng các thuật toán đã được phê duyệt kiểm tra xem Tink có đang sử dụng mô-đun mật mã đã được xác thực hay không.

Thao tác này sẽ thay đổi hành vi của Tink theo những cách sau:

  • Các hàm Register() chỉ đăng ký các thuật toán có phương thức triển khai đã được xác thực FIPS. Điều này có nghĩa là bạn chỉ có thể sử dụng các Bộ khoá cho các thuật toán sử dụng mô-đun mật mã đã được xác thực.
  • Tink sẽ kiểm tra xem BoringSSL đã được xây dựng bằng mô-đun BoringCrypto hay chưa. Các lệnh gọi đến dữ liệu gốc sẽ trả về lỗi INTERNAL khi không có mô-đun.
  • Việc sử dụng dữ liệu gốc trong subtle/ chỉ bị hạn chế ở các thuật toán sử dụng mô-đun mật mã đã xác thực.

BoringCrypto

Tink sử dụng BoringCrypto trong C++ để cung cấp quyền truy cập vào mô-đun mật mã đã xác thực. Trạng thái xác thực hiện tại áp dụng các quy tắc ràng buộc bổ sung sau đây cho các thuật toán có sẵn khi ở chế độ chỉ FIPS:

  • AES-CMAC chưa được xác thực và không có sẵn
  • RSA-SSA-PKCS1 bị hạn chế ở mô-đun 3072 bit
  • RSA-SSA-PSS bị hạn chế ở mô-đun 3072 bit

Để sử dụng mô-đun BoringCrypto với Bazel, bạn có thể huỷ nhận xét về định nghĩa local_repository cho boringssl trong C++ WORKSPACE.

Bật tại thời điểm biên dịch

Để tạo Tink ở chế độ chỉ FIPS, hãy đặt cờ tại thời điểm biên dịch:

bazel build ... --//third_party/tink/cc/config:use_only_fips=True

Nếu muốn kiểm tra trong thời gian chạy xem Tink đã được tích hợp ở chế độ chỉ FIPS hay chưa, bạn có thể thêm tiêu đề internal/fips_utils.h để cung cấp hằng số kUseOnlyFips.

Nếu bạn không tạo Tink ở chế độ chỉ FIPS, thì ứng dụng vẫn có thể sử dụng các phương thức triển khai đã được xác thực cho một số thuật toán nhưng không hạn chế việc sử dụng các thuật toán khác.

Bật trong thời gian chạy

Thay vì tạo Tink ở chế độ chỉ FIPS, bạn có thể gọi crypto::tink::RestrictToFips() từ config/tink_fips.h để đặt cờ trong thời gian chạy để bật các hạn chế đối với các dữ liệu nguyên gốc FIPS.

CẢNH BÁO: Nếu sử dụng tuỳ chọn thời gian chạy, bạn phải gọi crypto::tink::RestrictToFips() trước khi xử lý bất kỳ tài liệu chính nào, đăng ký trình quản lý khoá hoặc các chức năng Tink khác. Ngoài ra, bạn phải đảm bảo rằng BoringSSL đã được xây dựng bằng mô-đun BoringCrypto, nếu không, Tink sẽ không cho phép bạn xử lý bất kỳ dữ liệu nào.