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 模式。

注意:僅僅使用符合 FIPS 140-3 標準並經過驗證的加密模組,本身可能無法滿足所有相關的監管要求。Go 團隊無法就所提供的 FIPS 140-3 模式的使用是否能滿足個別使用者的特定監管要求提供任何保證或支援。應仔細確定此模組的使用是否滿足您的特定要求。

Go 加密模組

Go 加密模組是 crypto/internal/fips140/... 下的一系列標準庫 Go 包,它們實現了 FIPS 140-3 批准的演算法。

諸如 crypto/ecdsacrypto/rand 之類的公共 API 包透明地使用 Go 加密模組來實現 FIPS 140-3 演算法。

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 相同的安全級別,隨機位元組也從平臺的 CSPRNG 中獲取,並在每次 Read 時混合到輸出中作為未計入的額外資料。

  • crypto/tls 包將忽略並不會協商任何未經 FIPS 140-3 批准的協議版本、密碼套件、簽名演算法或金鑰交換機制。

  • crypto/rsa.SignPSSPSSSaltLengthAuto 將把鹽的長度限制在雜湊的長度。

當使用 GODEBUG=fips140=only 時,除了上述功能外,不符合 FIPS 140-3 的加密演算法將返回錯誤或 panic。請注意,此模式是盡力而為的,不能保證符合所有 FIPS 140-3 要求。

OpenBSD、Wasm、AIX 和 32 位 Windows 平臺不支援 GODEBUG=fips140=ononly

crypto/fips140

crypto/fips140.Enabled 函式報告 FIPS 140-3 模式是否處於活動狀態。

GOFIPS140 環境變數

GOFIPS140 環境變數可以與 go buildgo installgo test 一起使用,以選擇要連結到可執行程式中的 Go 加密模組版本。

  • off 是預設值,並使用正在使用的標準庫樹中的 crypto/internal/fips140/... 包。

  • latestoff 類似,但預設啟用 FIPS 140-3 模式。

  • v1.0.0 使用 Go 加密模組 v1.0.0 版本,該版本於 2025 年初凍結,並首次隨 Go 1.24 釋出。它預設啟用 FIPS 140-3 模式。

模組驗證

Google 目前與 Geomys 簽訂了合同關係,以促進 Go 加密模組至少每年進行一次 CMVP 驗證。在驗證時,我們將凍結 Go 加密模組並建立一個新的模組版本以供提交。

這些驗證在一套全面的操作環境中進行測試,支援許多流行的作業系統和硬體平臺組合。

如果模組中發現安全問題,可能會進行非週期性驗證。

已驗證的模組版本

已完成 CMVP 驗證的模組版本列表

目前沒有已完成驗證的模組版本。

正在處理中的模組版本

目前在 CMVP 正在處理中的模組列表中的模組版本列表

正在測試的模組版本

目前在 CMVP 正在測試的實施列表中的模組版本列表

目前沒有正在測試的模組版本。

Go+BoringCrypto

以前使用 BoringCrypto 模組用於某些 FIPS 140-3 批准演算法的不受支援機制目前仍然可用,但它將在未來的版本中被移除並替換為本頁描述的機制。

Go+BoringCrypto 與原生的 FIPS 140-3 模式不相容。