哈希(Hash)技术,最初应用于数据编码领域,主要分为哈希函数(Hash Function)与哈希表(Hash Table)两个部分。哈希函数是一种将任意数据映射为固定长度输出值的算法;而哈希表则是一种用于存储(键,值)对应关系的资料结构。接下来,我们将对哈希函数和哈希表进行简要介绍。若想深入了解哈希表,请参阅文末的参考资料。
### 什么是哈希函数?哈希函数(Hash Function)是一种将输入值映射到另一个值域的技术。其底层拥有复杂的数学公式,包含一些神秘的数字(magic number)。有兴趣的读者可以寻找相关论文进行深入研究。在此,我们可以将哈希函数想象成一台转换器,将输入值丢入其中,便会产生一个输出值。这种转换具有一个重要特性——单向性,即one-way function。输入值可以通过转换得到输出值,但输出值却无法逆推出输入值,具有不可逆的特性。
### 什么是哈希表?哈希表(Hash Table)是一种用于存储(键,值)的资料结构。通常,一个键对应一个值。值就是要存储的数据,而键可以想象成数据的标签。要查找数据,就需要使用相应的键进行搜索。例如,有一些数据是许多车主的姓名和车子的品牌:
### 哈希表示例很明显,左边是车主姓名,右边是该车主的车子品牌。因此,我们可以假定键是车主姓名,值是车子品牌。要查找键名为"Michael"的记录,就可以找到对应的值,也就是车子品牌为"Tesla"。在哈希表中,键和值分别代表原始输入和通过哈希函数转换后的输出。需要注意的是,某些哈希函数可能会出现不同输入产生相同输出的情况。这种情况在哈希表中称为"冲突(Collision)"。在较旧的哈希函数,如MD2、MD5等中,就存在冲突的情况。但对于区块链等应用场景,哈希函数不能存在冲突。原因有很多,例如,不能用作电子签名的辨别。因此,在区块链中,通常使用密码哈希函数(Cryptographic Hash Function)。
### 什么是密码哈希函数?密码哈希函数是哈希函数的一种类型,具有哈希函数的所有特性。但密码哈希函数得出的输出不会发生冲突,具有"碰撞抵抗性(Collision-Resistant)"。因此,可以明确区分输入信息是否不同。在区块链中,通常使用密码哈希函数作为哈希函数。
在密码哈希函数中,有许多不同的算法,常见的有MD5、SHA家族等。比特币中使用的哈希算法就是SHA家族中的SHA-256算法。
密码哈希函数示例:
例子中可看出,多了一个感叹号,输出结果就会发生很大的改变。有兴趣的读者可以上网搜索线上哈希,有很多网站可以尝试不同词语的哈希值。
### 什么是SHA?安全散列演算法SHA(Secure Hash Algorithm)是一种密码哈希函数的安全标准,属于SHA家族。SHA家族的算法由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布,是美国政府标准。
常见的SHA家族包括SHA-1、SHA-2(包括SHA-256和SHA-512)等。其中,SHA-256算法无论输入什么数据,通过哈希函数得到的输出长度都是256位。维基百科上提供了SHA-256的虚拟码,有兴趣的读者可以查阅:https://zh.wikipedia.org/wiki/SHA-2
小知识:2017年,荷兰密码学研究小组CWI和Google宣布成功攻破了SHA-1。
### Hash的常见用途Hash技术常用于以下场景:
- 档案校验码:使用Hash技术可以对档案进行校验,以确保档案的完整性和安全性。
- 使用者密码储存和比对:可以将要隐藏的资料用Hash的方式加密起来。要确认加密密文的原始资料时,也可以利用Hash的特性进行验证。例如,将使用者密码Hash后存储,这样资料库中就不会直接存储公开的使用者密码。要确认使用者输入的密码是否正确,只需要将输入的密码Hash后与资料库中储存的密文进行比对即可。
小知识:明文(Plain Text)和密文(Cipher Text)是密码学中的基本概念。明文指的是加密前的原始数据,明文加密后就会变成密文。例如,在Hash的例子中,"Hi, We are blockbar"是明文,而"9cd454c137d2910ea3333d2167b899242b876e5c1fb489f1906f34f680951851"是密文。
标签: 数字货币