第5章 哈希函数
5.1 哈希函数的特性
哈希函数是指一类数学运算过程,它接受任意大小的输入值,经过运算后可以给出一个确定的固定长度的输出值,这个输出值可以作为这个输入值的数字指纹。正如对于双胞胎而言,他们各自的指纹也是独一无二的,哈希函数的设计使得它也具有同样的特性:即使是非常微小的输入值差别,哈希函数的运算结果也会有非常巨大的差异。除此以外,哈希函数没有任何启发式算法,输入和输出的关系看起来是完全随机的,例如给一个确定的输出结果,要求对应的输入值应该是多少,或者是要求输出结果小于某个值,问一个符合条件的输入值应该是多少,这些问题的求解没有什么技巧和方法可循,只能通过不断地进行尝试,尝试的次数越多,越有可能找到答案。
人们可以利用哈希函数的这些特性实现很多功能。例如数据保护:将数据的内容和数据的哈希值一起发送,接收者对接收到的数据进行哈希运算,对比即可知道数据是否被篡改。再比如,网站在进行用户登录时,可以在数据库里存储用户密码的哈希值,与用户输入的密码的哈希值进行比对来验证身份,好处是如果数据库泄露,黑客也不能通过这些哈希值来反推出用户的密码,相对来说比较安全。
值得注意的是,哈希函数的输入集合是无限的,而由于输出长度固定,输出的所有可能的集合是有限的,根据鸽笼原理:n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。所以两个不同的输入值有相同的哈希值理论上是一定存在的,但这样的事情发生的概率非常小,而且哈希函数也在不断改进的过程中,SHA1函数就曾经被密码分析人员发现了有效的攻击方法,此后如比特币在内的系统采用了更先进的SHA2系列算法,比特币多年的良好运行,表明SHA256算法经受了时间的检验。此外,连续多次使用哈希函数也是一种更加安全的选择。
哈希函数在比特币中有多处运用,可以说扮演了非常关键的角色。