数字签名
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
借助数字签名原语,您可以验证是否有人篡改了您的数据。它可确保签名数据的真实性和完整性,但不能确保其私密性。它是非对称的,这意味着它使用一对密钥(公钥和私钥)。
数字签名原语具有以下属性:
- 真实性:除非您拥有私钥,否则无法创建
PublicKeyVerify.Verify(signature, message) 验证通过的签名。
- 非对称:创建签名时使用的密钥与验证签名时使用的密钥不同。这样,您就可以将公钥分发给无法自行创建签名的各方,以便他们验证签名。
如果您不需要非对称性,请考虑改用更简单高效的 MAC 原语。
数字签名的功能在 Tink 中表示为一对原语:
- 用于对数据进行签名的 PublicKeySign
- 用于验证签名的 PublicKeyVerify
选择密钥类型
对于大多数使用场景,我们建议使用 ML_DSA_65 或 ECDSA_P256,但也有多种其他选项。一般来说,以下情况属实:
对于以下非后量子算法,您可能需要在不久的将来更改密钥类型。
- ECDSA_P256 是使用最广泛的选项,也是合理的默认选项。不过,请注意,ECDSA 签名是可延展的。
- ED25519 可创建确定性签名,并提供比 ECDSA_P256 更好的性能。
- RSA_SSA_PKCS1_3072_SHA256_F4 可创建确定性签名,并提供最佳验证性能(但签名速度远慢于 ECDSA_P256 或 ED25519)。
最低安全保障
- 待签名的数据可以具有任意长度
- 针对基于椭圆曲线的方案,在自适应选择消息攻击下的 128 位安全等级
- 针对基于 RSA 的方案的自适应选择消息攻击的 112 位安全级别(允许使用 2048 位密钥)
可塑性
如果攻击者可以为已签名的消息创建不同的有效签名,则签名方案是可延展的。虽然这在大多数情况下都不是问题,但在某些情况下,程序员会隐式地假设有效签名是唯一的,这可能会导致意外结果。
用例示例
请参阅“我想要对数据进行数字签名”。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2026-03-23。
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["没有我需要的信息","missingTheInformationINeed","thumb-down"],["太复杂/步骤太多","tooComplicatedTooManySteps","thumb-down"],["内容需要更新","outOfDate","thumb-down"],["翻译问题","translationIssue","thumb-down"],["示例/代码问题","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2026-03-23。"],[],["Digital signatures ensure data authenticity and integrity using asymmetric key pairs (public and private). `PublicKeySign` signs data, while `PublicKeyVerify` checks signatures. Key options include the widely used ECDSA_P256, faster ED25519, and high-verification-performance RSA_SSA_PKCS1_3072_SHA256_F4. Signatures offer 128-bit security (elliptic curves) or 112-bit security (RSA). ECDSA signatures are malleable, allowing attackers to forge valid signatures. If asymmetry is not needed consider using MAC.\n"]]