美国驾照背面的 PDF417 条形码里,绝大部分是公开的明文域:三位字母代码加取值,姓名、出生与签发日期、证号、证件识别码等等,头部还带着签发机构的编号。真正有意思的是各州自留的子文件,以 Z 加州字母开头,通用扫码器会直接跳过它。

穿过铁链的旧挂锁特写

签名一直在,验证方式一直没有

作者 Ryan Fahey 发现,代工厂 Canadian Bank Note 为纽约、弗吉尼亚、北卡、南卡、威斯康星五个州印制的证件里,其实都放了数字签名——不只是纽约和弗吉尼亚两个。他手上没有南卡和威斯康星的卡,但有证件的读者解码后确认,那个字段确实存在。

把签名“还原”成可验证的东西

这个安全特性此前几乎是摆设:没有公开的方法,谁也验不了。作者发现 CBN 那段字符串是 Ascii85 编码,解码后是一小段 DER 结构:一个 SEQUENCE 里装两个 256 位整数,正是 P-256 曲线上的 ECDSA 签名编码。他手里的真实样本长度落在 70、71、72 字节,符合 ECDSA 因 r、s 随机而导致的编码长度浮动。

数学上有个漂亮的性质:只要拿到签名和它签的原文,就能反推出产生签名的公钥。麻烦在于“原文”完全没有文档。作者试过成千上万种拼接顺序都失败,最后发现签名域本身也被签了进去——编码时先用占位符填满该字段,对整段做签名,再把真签名覆盖上去;验证时把占位符填回去即可。

于是流程变得可复现:取原始字节,把签名域替换成等长的一串 0,做一次 SHA-256,再用 P-256 验证 DER 签名。三张纽约卡得出同一个公钥,六份弗吉尼亚样本的十五组配对也得出同一个公钥。他把公钥和浏览器端验证器一起公开——公钥本来就该公开,反推出来只让人能“验证”,并不能伪造。

已经做完的事,缺的只是公开

对比很鲜明:加州车管局采用了基于 W3C 可验证凭证的条形码,公钥挂在自家域名的约定地址上,还开源了验证器与测试样本。而同一家代工厂 IDEMIA 为五十一个辖区中的三十一个印证件,公开可验证的只有一个。工程早就完成并投产了,缺的不是能力。

作者对 CBN 的诉求也极低:不用改任何东西,只需在网站上放一页纸,写明签名原文如何构造、每个州的公钥是什么。换句话说,一道周末就能写完的文档,决定了一个安全特性是保护所有人,还是谁都不保护。

这件事对做产业数字化的团队同样成立:签名、证书、验签这类能力,价值全在于“外人能不能验”。只在自己系统内部闭环的加密,容易变成一种心理安慰;把验证方式公开,才是它真正开始工作的时刻。