跳转到正文
buybitcoinsmart

术语表 /开发者参考

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 保留了同样的搭配,即在签名字节旁记录算法标识符,但客户端不再接受曾经合法的所有标识符。

请勿混淆

常见问题

大多数 BIP70 支付请求实际上都已签名吗?

没有。该字段默认值为 none,即没有证书也没有签名,这是常见情形。收到此类请求的钱包可以显示金额和目标地址,但没有商家身份可供显示。

比特币允许发送方选择签名算法吗?

不允许,这是有意设计的优势。被花费的输出决定适用 ECDSA 还是 Schnorr 规则,因此没有人可以要求使用较弱的选项。Taproot 于2021年11月在区块709,632加入了 Schnorr 验证。

相关术语

开发者参考中的更多术语

阅读本页英文版