FIPS 140-3 合規性
從 Go 1.24 開始,Go 二進位制檔案可以原生以一種有助於實現 FIPS 140-3 合規性的模式執行。此外,工具鏈可以針對構成 Go 加密模組的凍結版本的加密軟體包進行構建。
FIPS 140-3
NIST FIPS 140-3 是美國政府針對加密應用的合規制度,除其他要求外,它要求使用一組經批准的演算法,並要求使用在目標操作環境中經過測試的、透過 CMVP 驗證的加密模組。
本頁描述的機制有助於 Go 應用程式實現合規性。
不需要 FIPS 140-3 合規性的應用程式可以安全地忽略這些機制,並且不應啟用 FIPS 140-3 模式。
Go 加密模組
Go 加密模組是 crypto/internal/fips140/...
下的標準庫 Go 包的集合,這些包實現了 FIPS 140-3 批准的演算法。
公共 API 包,如 crypto/ecdsa
和 crypto/rand
,透明地使用 Go 加密模組來實現 FIPS 140-3 演算法。
Go 加密模組 v1.0.0 版本目前正在由 CMVP 認可的實驗室進行測試。
FIPS 140-3 模式
執行時 fips140
GODEBUG 選項控制 Go 加密模組是否在 FIPS 140-3 模式下執行。它預設為 off
。程式啟動後無法更改此選項。
當在 FIPS 140-3 模式下執行時(fips140
GODEBUG 設定為 on
)
-
Go 加密模組在
init
時自動執行完整性自檢,將構建時計算出的模組目標檔案校驗和與載入到記憶體中的符號進行比較。 -
所有演算法都根據相關的 FIPS 140-3 實現指南執行已知答案自測,無論是在
init
時還是首次使用時。 -
對生成的加密金鑰執行成對一致性測試。請注意,這可能導致某些金鑰型別(特別是臨時金鑰)的速度減慢高達 2 倍。
-
crypto/rand.Reader
是基於 NIST SP 800-90A DRBG 實現的。為了保證與GODEBUG=fips140=off
相同的安全級別,在每次Read
時從平臺的 CSPRNG 獲取隨機位元組,並作為無憑據的附加資料混入輸出。 -
crypto/tls
包將忽略並不會協商任何不符合 NIST SP 800-52r2 的協議版本、密碼套件、簽名演算法或金鑰交換機制。 -
使用
PSSSaltLengthAuto
的crypto/rsa.SignPSS
會將鹽值的長度限制在雜湊長度以內。
當使用 GODEBUG=fips140=only
時,除上述情況外,不符合 FIPS 140-3 的加密演算法將返回錯誤或引起 panic。請注意,此模式是盡力而為,不能保證符合所有 FIPS 140-3 要求。
OpenBSD、Wasm、AIX 和 32 位 Windows 平臺不支援 GODEBUG=fips140=on
和 only
。
crypto/fips140
包
crypto/fips140.Enabled
函式報告 FIPS 140-3 模式是否啟用。
GOFIPS140
環境變數
GOFIPS140
環境變數可以與 go build
、go install
和 go test
一起使用,以選擇要連結到可執行程式中的 Go 加密模組版本。
-
off
是預設值,並使用當前標準庫樹中的crypto/internal/fips140/...
包。 -
latest
類似於off
,但預設啟用 FIPS 140-3 模式。 -
v1.0.0
使用 Go 加密模組 v1.0.0 版本,該版本於 2025 年初凍結,並首次隨 Go 1.24 釋出。它預設啟用 FIPS 140-3 模式。
Go+BoringCrypto
之前使用 BoringCrypto 模組實現某些 FIPS 140-3 批准演算法的(已不再支援的)機制目前仍然可用,但預計將在未來的版本中移除並替換為本頁描述的機制。
Go+BoringCrypto 與原生 FIPS 140-3 模式不相容。