比特币用到的哈希函数特性有碰撞阻力、单项不可逆、谜题友好性等,下面将逐个介绍:
1、碰撞阻力(collision resistence)具有强碰撞阻力的哈希函数H(),很难找到输入x≠y,使得H(x)==H(y)。
碰撞阻力的特性可用于检测数据是否被篡改,只要改变数据的一个字节,就会造成哈希结果的大不相同。比特币中的哈希指针就是用的这个特性,每个区块保存上一个区块的哈希,因此用户只要记住最新区块的哈希,就可以保证整个区块链未被篡改。Merkle tree数据结构同样运用了碰撞阻力特性,详见默克尔树(Merkle tree)章节)。
注意:
没有哪一个哈希函数能够从数学上证明具有碰撞阻力特性,SHA-256、SHA3只是经过实践目前仍没有有效方法进行碰撞,因此是可靠的,MD5、SHA1这些曾经具有碰撞阻力特性的哈希函数已经被破解,不再具有碰撞阻力特性。
由x可以很容易的计算出H(x),但是由H(x)不可能推算出x。
单向不可逆特性可用于数字承诺(digital commitment),用户可以将信息和一些随机数据组合计算出哈希,然后公布哈希给别人,这样可以藏匿信息内容,别人无法猜测承诺的信息;等到需要验证的时候,才将承诺内容公开用于计算哈希,如与事先公布的哈希一致,则可以证明自己预先承诺过该信息。本人也无法更改承诺内容,因为这样会造成计算的哈希与一开始公布的哈希不一致。
注意:
输入取值必须来自广泛集合,且均匀分布,这样单向不可逆特性才会有效。
本人在做银联人脸识别支付项目的时候,银联曾经在某一个版本的方案中闹出一个笑话,将6位个人数字密码计算哈希后保存在数据库中,用于路由索引,由于只有6位数字(共10的6次方种哈希结果),可以很容易根据哈希反推出原始6位密码,后来反应给银联,银联给出了新版方案。
一般采取的方案是给原始取值加盐,扩大原始取值的集合空间。(x||salt) → H(x||salt)
3、谜题友好性(puzzle-friendliness)谜题友好性即为要想得到某个哈希值,只能一直尝试取值,直到算出的哈希满足要求。
在比特币挖矿中,求解区块头中的nonce值,使得H(blockheader) ≤ target域值,这就是PoW工作量证明算法。
谜题友好性是区块链比特币挖矿算法特有要求的特性,在现代密码学中不存在要求该特性。
二、数字签名在比特币中生成公私钥对即可建立身份,私钥由自己保管,用于数字签名,将公钥公开给所有人,这样所有人可以验证我的签名有效性。
注意:
ECDSA(Elliptic Curve Digital Signature Algorithm)中,需要在签名时拥有良好的随机源,否则会造成私钥泄露。算法具体流程可以参考相关资料。