Cryptographic Hash Functions(加密哈希函数)
Hash函数可以接受任何字符串(任意大小)作为输入,产生固定大小(256)的输出。
性质:
-
collision resistance(抗碰撞) / collision-free(无碰撞)
没有人可以找到 x 和 y 的值,x !=y 但是 H(x)=H(y)。
输入空间是无限大的,输入内容可以是任意字符串,输出必须是256位的字符串。若输入空间中的每一点映射到输出空间上,必然存在很多输入值有相同输出。(碰撞是存在的,但人为制造碰撞的可能性是无限小的)
目前没有哪个Hash函数被证明是collision-free的(无法理论证明),只是人们没有成功找到碰撞。所以我们选择相信是collision-free。
应用:message digest
上传文件,记录H(文件)值
下载文件,计算H(文件’)值
if(H(文件)==H(文件’))文件没有被篡改
-
hiding(隐藏)
得到 Hash函数的输出 H(x),没有可行的方法来确定输入的 x 是什么。Hash函数计算过程是单向的、不可逆的。
实际操作:H( x | nonce ),其中 nonce 为随机值,保证输入的随机性,分布均匀。
给定 H( x | nonce )的值,找到 x 是不可能的,这就是 Hash函数所拥有的隐藏属性。
用法:结合 collision resistance 使用,实现 digital equivalent of a sealed envelope(数字加密信封)。
-
puzzle-friendly(谜题友好性)
H( id | x)≤ target,给定一个 target(目标阈值),使得计算的 Hash值落入其中。id 为特定的谜题,x 则是谜题的解决方案。
这里的 puzzle-friendly 体现在谜题没有解决的方案。
唯一的办法就是不断地尝试各种不同的随机值,使得Hash值落在target 中。
一旦有一个人找到了随机数,其他人要验证它是否落在 target 中是很容易的,只需要进行一次 Hash函数运算就可以了。
所以说在比特币系统中 difficulty to solve ,but easy to verify(挖矿很难,验证很容易)
- 比特币中所使用的 Hash函数 为 SHA-256