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 phải là Đã xác thực FIPS 140-2. Tuy nhiên, công cụ này hỗ trợ một số FIPS 140-2 thuật toán được phê duyệt và những phương pháp 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 WORKSPACE để tạo BoringSSL ở chế độ FIPS.

Lưu ý rằng không gian làm việc này không đảm bảo vốn có rằng bạn sử dụng BoringSSL tuân thủ FIPS. Chúng tôi thực sự khuyên bạn nên đọc hướng dẫn chính sách bảo mật cho 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 Phụ lục A của FIPS 140-2):

  • 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ạn bắt buộc phải sử dụng các thuật toán đã được phê duyệt và xác thực theo FIPS 140-2 khác, bạn có thể tạo Tink ở chế độ chỉ FIPS. Chế độ này hạn chế dữ liệu sử dụng cho các thuật toán được phê duyệt kiểm tra xem Tink có đang sử dụng thuật toán đã được xác thực hay không mô-đun mật mã.

Điều này 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ó FIPS cấu hình triển khai đã xác thực. Điều này có nghĩa là bạn chỉ có thể sử dụng Bộ khoá cho các thuật toán sử dụng mô-đun mật mã đã xác thực.
  • Tink kiểm tra xem BoringSSL đã được tạo bằng mô-đun BoringCrypto hay chưa. Lệnh gọi đến dữ liệu gốc sẽ trả về lỗi INTERNAL khi mô-đun không sẵn có.
  • Bạn chỉ có thể sử dụng dữ liệu gốc trong subtle/ cho các thuật toán sử dụng một 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ã đã được xác thực. Hiện tại trạng thái xác thực đặt ra các hạn chế bổ sung sau đây đối với khi ở chế độ chỉ FIPS:

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

Để sử dụng mô-đun BoringCrypto với Bazel, bạn có thể huỷ nhận xét Định nghĩa local_repository cho boringssl trong C++ KHÔNG GIAN LÀM VIỆC.

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

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

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

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

Nếu bạn không tạo Tink ở chế độ chỉ FIPS, ứng dụng này vẫn có thể sử dụng những cách triển khai đã được xác thực đối với 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ỉ dành cho FIPS, bạn có thể gọi crypto::tink::RestrictToFips() từ config/tink_fips.h để đặt một cờ trong thời gian chạy để bật các hạn chế đối với dữ liệu gốc FIPS.

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