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 中取消註解 boringssl
的 local_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 不允許您處理任何資料。