Tink 本身未经过 FIPS 140-2 验证。不过,它支持多种经 FIPS 140-2 批准的算法,并且底层实现可以使用经过验证的加密模块,例如 BoringSSLs BoringCrypto。Tink 包含一个工作区,用于在 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++ 工作区中对 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()
。此外,您必须确保已使用 BoringCrypto 模块构建 BoringSSL,否则 Tink 不允许您处理任何数据。