使用 Tink 符合 FIPS 140-2 安全性規定

Tink 本身並未驗證 FIPS 140-2。不過,它支援多個 FIPS 140-2 核准的演算法,而且基礎實作可以使用經過驗證的加密編譯模組,例如 BoringSSLs BoringCrypto。Tink 包含 WORKSPACE,可在 FIPS 模式中建構 BoringSSL。

請注意,這個工作區不保證您在使用 BoringSSL,都符合 FIPS 規定。我們強烈建議您參閱 BoringCrypto 的官方安全性政策

支援的演算法

下列 Tink 中的演算法已根據 FIPS 140-2 獲得核准 (詳情請參閱 FIPS 140-2 Annex A):

  • 驗證式加密
    • AES-GCM
    • AES-CTR-HMAC-SHA256
  • MAC
    • HMAC-SHA256
    • AES-CMAC
  • 數位簽名
    • ECDSA
    • RSA-SSA-PKCS1
    • RSA-SSA-PSS

C++ 中的 FIPS 專屬模式

如果您需要使用 FIPS 140-2 核准的演算法並經過驗證的實作,可以在 FIPS 專屬模式下建構 Tink。這樣會將使用範圍限制在核准的演算法,「並」檢查 Tink 是否使用經過驗證的密碼編譯模組。

這會透過以下方式變更 Tink 的行為:

  • Register() 函式只會註冊經過 FIPS 驗證實作的演算法。這表示您「只能」將 Keysets 用於演算法,並使用經過驗證的加密編譯模組。
  • Tink 會檢查 BoringSSL 是否已使用 BoringCrypto 模組建構。原始模組無法使用時,系統會傳回 INTERNAL 錯誤。
  • subtle/ 中使用原始物件,僅限於使用經驗證的加密編譯模組的演算法。

BoringCrypto

Tink 會使用 C++ 中的 BoringCrypto,提供已驗證加密編譯模組的存取權。在僅限 FIPS 模式下,其目前的驗證狀態會對可用的演算法產生下列額外限制:

  • AES-CMAC 尚未經過驗證,無法使用
  • RSA-SSA-PKCS1 僅限 3072 位元模數
  • RSA-SSA-PSS 僅限 3072 位元模數

如要將 BoringCrypto 模組與 Bazel 搭配使用,您可以在 C++ WorkSPACE 中取消註解 boringssllocal_repository 定義。

在編譯時啟用

如要在僅限 FIPS 模式下建構 Tink,請在編譯期間設定旗標:

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

如要在執行階段檢查 Tink 是否已在僅限 FIPS 模式下建構,可以加入 internal/fips_utils.h 標頭,藉此提供常數 kUseOnlyFips

如果您不是以僅限 FIPS 模式建構 Tink,仍可將經過驗證的實作用於「部分」演算法,但不會限制其他演算法的使用。

在執行階段啟用

除了在 FIPS 專屬模式中建構 Tink 之外,您也可以從 config/tink_fips.h 呼叫 crypto::tink::RestrictToFips(),在執行階段設定標記,啟用對 FIPS 原始物件的限制。

警告:如果您使用執行階段選項,則必須在處理任何金鑰內容、註冊金鑰管理工具或其他 Tink 功能之前呼叫 crypto::tink::RestrictToFips()。此外,您必須確保 BoringSSL 已使用 BoringCrypto 模組建構,否則 Tink 不允許您處理任何資料。