输入是公钥、消息(或其摘要)、签名以及算法及其参数;输出为有效或无效。严格的验证器还会拒绝格式错误的输入:非最小长度的 DER 编码、超出 1…n−1 范围的 r 或 s、不小于群的阶的 EdDSA S、长度错误的原始签名、不在曲线上的点,以及类型错误的密钥。
生产环境中大多数“invalid signature”错误都与密码学无关:被签名的字节不同(JSON 被重新序列化、空白或换行符被改动、缺少末尾换行),使用了不同的哈希,DER 签名被交给了只接受原始格式的验证器(或者反过来),曲线或 PSS 盐长度不一致,或者选错了密钥。逐一检查每个输入;签名验证工具会显示它所用的曲线、哈希和编码。
能防止实际攻击得逞的安全规则:在验证方固定算法,而不是从消息中读取算法(JWT alg,RFC 8725 §3.1);先验证,再解析载荷或根据载荷执行操作;验证密钥与身份之间的绑定(证书路径验证、JWKS kid、known_hosts);对于共识系统,要固定一套验证规则,因为各个库在 EdDSA 带余因子检查等边界情况上并不一致。