Qraft

哈希

哈希(哈希函数)是把任意长度的输入数据转换成固定长度输出值(哈希值、摘要)的函数。同样的输入总是得到同样的哈希值,但从哈希值反推出原始数据在计算上是做不到的(单向性)。另外,输入只要变动 1 个比特,哈希值就会发生很大变化(雪崩效应)。有代表性的算法是 SHA-256 和 SHA-3。

输入只改动一个字符,哈希值就变成完全不同的另一个值(雪崩效应)。只取 SHA-256 输出的前 16 位,看起来是这样。

输入SHA-256 输出的前 16 位
QR code2c24d35a117c162d
QR Code5a779155eadaaa3b
QR codesf24e1b51e717a757

二维码的周边技术中,哈希发挥作用的场面有好几处。二维码支付会把交易数据的哈希值与电子签名组合起来,用于检测支付信息是否被篡改。欧盟的数字新冠证明也是对疫苗接种数据的哈希施加电子签名,再存进二维码里。

一次性密码(TOTP)的生成也用到了哈希。它把密钥与当前时刻用 HMAC-SHA1(基于哈希的消息认证码)处理,从中导出 6 位数的验证码。用二维码传递密钥、再用哈希函数生成验证码,这就是两者的配合方式。

校验和也可以看作哈希的一种。二维码的格式信息版本信息由 BCH 码保护,就检验数据完整性这一点来说,它与哈希的目的是相同的。「用一个短的值来验证数据是否正确」这一原理,从二维码的内部结构一直贯通到应用层,是一项基础技术。

不过要留意,哈希并不等于加密。它不可逆,所以不能用来隐藏内容;而且对取值范围很窄的数据,比如 4 位数的个人识别码,只要把全部可能挨个算一遍就能对出原文。要保护这类数据,需要加上随机盐并使用专门为密码设计的、故意做得很慢的算法。

把二维码周边用到哈希的场面整理如下。

场面哈希的用法目的
二维码支付把交易数据的哈希值与电子签名组合起来检测支付信息是否被篡改
欧盟的数字新冠证明对疫苗接种数据的哈希施加电子签名,再存进二维码里确认数据没有被改动过
一次性密码(TOTP)把密钥与当前时刻用 HMAC-SHA1 处理导出 6 位数的验证码
二维码的格式信息与版本信息用 BCH 码保护检验数据的完整性