使用 Tink 来满足 FIPS 140-2 安全要求

Tink 本身未经过 FIPS 140-2 验证。不过,它支持多种经 FIPS 140-2 批准的算法,并且底层实现可以使用经过验证的加密模块,例如 BoringSSLs BoringCryptoTink 包含一个工作区,用于在 FIPS 模式下构建 BoringSSL。

请注意,此工作区并不能保证您使用的 BoringSSL 符合 FIPS。我们强烈建议您阅读 BoringCrypto 的官方安全政策

支持的算法

Tink 中的以下算法已根据 FIPS 140-2 获得批准(如需了解详情,请参阅 FIPS 140-2 附录 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 验证的算法。这意味着您只能将密钥集用于使用经过验证的加密模块的算法。
  • Tink 会检查是否使用 BoringCrypto 模块构建了 BoringSSL。如果模块不可用,调用基元会返回 INTERNAL 错误。
  • 只有在算法利用经过验证的加密模块后,才能在 subtle/ 中使用基元。

BoringCrypto

Tink 使用 C++ 形式的 BoringCrypto 来提供对经过验证的加密模块的访问权限。在仅限 FIPS 模式下,其当前的验证状态会对可用算法施加以下额外限制:

  • AES-CMAC 未经验证,无法使用
  • RSA-SSA-PKCS1 被限制为 3072 位模数
  • RSA-SSA-PSS 限制为 3072 位模数

如需将 BoringCrypto 模块与 Bazel 搭配使用,您可以在 C++ 工作区中对 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()。此外,您必须确保已使用 BoringCrypto 模块构建 BoringSSL,否则 Tink 不允许您处理任何数据。