(1).散列表(Hash table,也叫哈希表),是依据关键码值(Key value)而直接进行訪问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来訪问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
MD5和sha系列算法是应用最广泛的hash算法。hash算法最重要的特点是不可逆和无冲突,在信息安全方面的应用如下几个方面:
1.文件校验
2.数字签名
3.鉴权协议
Hash算法函数根据分类:加法hash、位运算hash、乘法hash、除法hash、查表hash等。
(2).区块链中的hash算法
Hash算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。利用其不可逆行可对明文进行加密,比特币中使用的hash算法位sha-256。
应用:
1.区块链中节点的地址,公钥,私钥计算。以地址为例:公钥经过一次SHA256计算,再进行一次RIPEMD160计算,得到一个公钥哈希(20字节\160比特),添加版本信息,再来两次SHA256运算、取前4比特字节,放到哈希公钥加版本信息后,再经过base58编码,最终得到地址。
2.merkle tree:merkle tree上的叶节点存放hash计算后的hash值,非叶节点是其对应的子节点串联的字符串的hash值。用于区块头和SPV认证中。
3.工作量证明pow:计算的其实就是一个nonce,当这个随机数和其他散列过的数据合并时,产生一个比规定目标小(target)值。挖矿也可以理解一种快速不可逆的计算。SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET。
4.比特币中的bloom filter布隆过滤器,布隆过滤器基于hash函数的快速查找。解决了客户端检索的问题,原理是Bloom filter可以快速判断出某检索值一定不存在于某个指定的集合,从而可以过滤掉大量无关数据,减少客户端不必要的下载量。
(3)Go语言支持
go crypto标准包包含了一些常用的哈希算法,例如md5、sha1、sha256、sha512等。以sha1算法为例了解go如何生成哈希值。
package main
import (
"crypto/sha1"
"fmt"
"io"
"log"
"os"
)
func main() {
data := []byte("this is test, hello world, keep coding")
fmt.Printf("%x \n", sha1.Sum(data))
h := sha1.New()
io.WriteString(h, "this is test, hello world, keep coding")
fmt.Printf("%x \n", h.Sum(nil))
fmt.Printf("%x \n", shaFile("./file.txt"))
}
//shaFile利用sha1算法将目标文件生成哈希值
func shaFile(filePath string) []byte {
f, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
h := sha1.New()
if _, err := io.Copy(h, f); err != nil {
log.Fatal(err)
}
return h.Sum(nil)
}
程序运行结果为:
a1 7b 4a 11 04 95 e1 c4 70 8f a0 33 db 89 d6 f6 13 3d 6a 48
a1 7b 4a 11 04 95 e1 c4 70 8f a0 33 db 89 d6 f6 13 3d 6a 48
ccf59c07592fb103ff88062c924962b6f9839a9b