数字签名
数字签名可让您验证没有人篡改您的数据。它提供签名数据的真实性和完整性,但不提供其机密性。它不对称,这意味着它使用一对密钥(公钥和私钥)。
签名具有以下属性:
- 真实性:除非您拥有私钥,否则无法创建由
PublicKeyVerify.Verify(signature, message)
进行验证的签名。
- 非对称:创建签名所用的密钥与验证签名所用的密钥不同。这样,您就可以将公钥分发到无法自行创建签名的相关方来验证签名。
如果您不需要不对称性,请考虑改用更简单、更高效的 MAC。
数字签名的功能在 Tink 中以一对基元的形式表示:
- PublicKeySign(用于签名数据)
- PublicKeyVerify(用于验证签名)
选择密钥类型
对于大多数使用场景,我们建议使用 ECDSA_P256,但也有可用的选项。一般来说,以下情况是正确的:
- ECDSA_P256 是使用最广泛的选项,也是合理的默认值。不过,请注意,ECDSA 签名是可更改的。
- 与 ECDSA_P256 相比,ED25519 可创建确定性签名,并提供更出色的性能。
- RSA_SSA_PKCS1_3072_SHA256_F4 可创建确定性签名并提供最佳验证性能(但签名比 ECDSA_P256 或 ED25519 慢得多)。
最低限度的安全保障
- 要签名的数据可任意长度
- 针对基于椭圆曲线的方案的自适应选择消息攻击,提供 128 位安全等级
- 针对基于 RSA 的方案的自适应选择消息攻击的 112 位安全等级(允许 2048 位密钥)
示例用例
请参阅我想对数据进行数字签名。
可推广性
如果攻击者可以为已签名消息创建不同的有效签名,则签名方案是可更改的。虽然这对于大多数场景来说不是问题,但在某些情况下,程序员会隐式假定有效签名是唯一的,这可能会导致意外结果。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-12-01。
[null,null,["最后更新时间 (UTC):2023-12-01。"],[[["Digital signatures ensure data integrity and authenticity by verifying that data hasn't been tampered with."],["They use a pair of keys (public and private) for asymmetric signing and verification, allowing for secure distribution of the public key."],["Tink provides two primitives for digital signatures: `PublicKeySign` for signing and `PublicKeyVerify` for verifying."],["ECDSA_P256 is generally recommended, with ED25519 offering better performance and RSA_SSA_PKCS1_3072_SHA256_F4 providing the fastest verification."],["Digital signatures in Tink guarantee a minimum of 112-bit security and support data of any length."]]],[]]