术语表 /开发者参考
PP pki type
- PP pki type 是什么?
- PP pki type 是 BIP70 支付请求中的一个单词字符串,用于说明商家如何对该请求签名:none、采用 SHA-256的 x509,或采用 SHA-1的 x509。
规定于 BIP-70。
每个对内容签名的协议都必须指明所用算法,而在发送方可控制的字段中指明算法,正是降级攻击的起点。BIP70 提供了三个取值,其中一个在规范编写之前多年就已被认为是弱算法。浏览器在2017年1月完成了对 SHA-1证书的淘汰,而该支付协议从未发布过更新。
运作方式
状态:已成历史。PP pki type 是 PaymentRequest 的第2个字段,默认值为字符串 "none",自2020年6月3日发布的0.20.0版起,Bitcoin Core 中已不再包含该字段。
规范共定义了三个取值,虽然预留了空间,但从未登记过第四个。
"none" 表示未签名的请求。证书字段为空,签名字段也为空,钱包可以显示金额和目标地址,但完全无法显示任何身份信息。实际流通的请求大多正是如此。
"x509+sha256" 表示商家将整条消息序列化(签名字段置空),用 SHA-256对结果计算哈希,再用所附证书链中第一份证书对应的私钥对该哈希签名。
"x509+sha1" 表示同一流程,只是以 SHA-1取代 SHA-256。
提供弱算法这一选项,正是值得注意之处。验证方如果认可发送方指明的任何算法,其强度就只相当于它仍然接受的最弱算法,因此后来的设计都在验证方固定可接受的算法集合,而不是从消息中读取。即便在2013年,SHA-1也是个糟糕的选择。2005年已发表了比暴力破解更快的碰撞攻击,NIST 也禁止在2013年之后使用 SHA-1生成新的数字签名。证书颁发机构在2015年底停止签发 SHA-1证书,Chrome 56在2017年1月不再信任这类证书,一个月后又出现了完整的公开碰撞。
在哪里会遇到它
比特币本身就提供了与“由发送方指定签名算法”相反的例子,值得记住。
比特币交易从不与验证者协商签名算法。被花费的输出决定了这一问题:Taproot 之前的输出用 secp256k1 上的 ECDSA 验证,支付给 Taproot 密钥的输出则按 BIP340 用 Schnorr 验证,该规则于2021年11月在区块709,632激活。花费者无法提出更容易被破解的方案,因为这一选择在收到这些币时就已确定。
这一差异说明了为什么基于证书的层叠加在比特币之上如此别扭。共识规则对所有人一视同仁,只能通过协调一致的升级来改变;而指明算法的字段是一种协商,协商是会被降级的。
如果您是在选择购买渠道而不是编写软件,那么有用之处范围虽窄却很实在。一个平台若“为了兼容性”而保留过时的加密选项,就是在告诉您它如何权衡便利与安全,这种判断也适用于您无法检查的系统其他部分。
PP pki type vs SSL 签名
PP pki type 指明的是一种方案,SSL 签名则是运行该方案的结果。把二者视为一回事,会使旧的 BIP70 文档令人困惑,因为一个请求可以指明类型却不带任何签名,这恰恰就是 "none" 的含义。现代 TLS 保留了同样的搭配,即在签名字节旁记录算法标识符,但客户端不再接受曾经合法的所有标识符。