Qraft

数字签名

数字签名是用公钥密码学,从数学上证明数据「由谁创建」(认证)以及「有没有被篡改」(完整性)的技术。签名方用私钥对数据的哈希值生成签名,接收方用对应的公钥核对这个签名是否成立。RSA 有时被说成「用私钥加密、用公钥解密」,但如今广泛使用的椭圆曲线签名(ECDSA)根本没有解密这一步,签名的生成和验证是各自独立的两种运算。它相当于纸质文件上印章和手写签名的数字版,但由于伪造在数学上极其困难,比物理签名更为可靠,而且验证不需要与签发方联网核对。

二维码与数字签名的组合在防伪场景中备受关注。普通二维码任何人都能生成,因此仿造一个外观相同、实际指向钓鱼(网络诈骗)站点的码非常容易。但如果在二维码的数据中嵌入数字签名,扫描时应用就能验证签名,判断这个码是否由正规的签发者创建,而不是只看链接长得像不像。

实际案例是欧盟的数字新冠证明(EU DCC)。它依据欧盟条例 2021/953 于 2021 年 7 月投入使用,条例的适用已于 2023 年 6 月 30 日结束。各国卫生主管部门用私钥对接种数据签名,再存入二维码。验证应用用公钥校验签名,确认证书未被篡改。签名采用 ECDSA P-256 与 SHA-256 的组合(COSE ES256),因此这一步是核对签名而不是解密。靠这个机制,即便是打印在纸上的二维码,伪造也变得极为困难,同时验证可以离线完成,边检口岸不必依赖网络。

规格在多大程度上规定了签名,各个领域并不一样。ICAO 方面,把带签名的数据放进二维码等二维条码的机制,已经作为 Doc 9303 第 13 部分的可视数字印章(VDS)完成标准化,并以离线验证为前提投入使用。而电子护照(eMRTD)的签名由护照本册里嵌入的 IC 芯片承担,并不是二维码。GS1 数字链接是把 GS1 识别代码写成网址形式的语法标准,签名并不包含在这个规格里,需要时要另外叠加一层机制。在票券、证书、产品认证中使用带签名的二维码时,先确认究竟是哪个规格规定了签名,才是可靠的出发点。不论采用哪一种规格,验证的一方都必须事先取得签发者的公钥,通常是以受信任的证书列表(trust list)的形式分发到验证设备上;二维码本身承载的只有被签名的数据和签名值这两部分。离线验证之所以能够成立,正是因为公钥已经提前保存在设备里,扫码时不需要再向服务器查询。