Golang与散列算法
散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。常用于保证数据完整性
单向散列函数一般用于产生消息摘要,密钥加密等,常见的有
- MD5(Message Digest Algorithm 5):是
RSA
数据安全公司开发的一种单向散列算法 - SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个
160
位的数值
哈希函数的基本特征
哈希函数不是加密算法,其特征为单向性和唯一性
具体如下
- 输入可以是任意长度
- 输出是固定长度
- 根据输入很容易计算出输出
- 根据输出很难计算出输入(几乎不可能)
- 两个不同的输入几乎不可能得到相同的输出
SHA-1
在1993
年,安全散列算法(SHA)由美国国家标准和技术协会(NIST)提出,并作为联邦信息处理标准(FIPS PUB 180)公布;1995
年又发布了一个修订版FIPS PUB 180-1
,通常称之为SHA-1
。SHA-1
是基于MD4
算法的,并且它的设计在很大程度上是模仿MD4
的。现在已成为公认的最安全的散列算法之一,并被广泛使用
SHA-1
是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程
该算法输入报文的最大长度不超过264
位,产生的输出是一个160
位的报文摘要。输入是按512
位的分组进行处理的。SHA-1
是不可逆的、防冲突,并具有良好的雪崩效应
sha1
是SHA
家族的五个算法之一(其它四个是SHA-224
、SHA-256
、SHA-384
,和SHA-512
)
SHA(Secure Hash Algorithm)
安全散列算法,是一系列密码散列函数,有多个不同安全等级的版本:SHA-1,SHA-224,SHA-256,SHA-384,SHA-512
防伪装,防窜扰,保证信息的合法性和完整性
算法流程:
-
填充,使得数据长度对
512
求余的结果为448
-
在信息摘要后面附加
64bit
,表示原始信息摘要的长度 -
初始化
h0
到h4
,每个h
都是32
位 -
h0
到h4
历经80
轮复杂的变换 -
把
h0
到h4
拼接起来,构成160
位,返回
常用函数
- New:创建Hash对象用于计算字节/字符
sha1
值 - Sum:计算字节切片
sha1
值
package main
import (
"crypto/sha1"
"fmt"
)
func main() {
data := []byte("This page intentionally left blank.")
fmt.Printf("%x\n", sha1.Sum(data))
}
sha256
、sha512
同理
使用示例
package main
import (
"crypto/sha1"
"fmt"
"io"
)
// sha1散列算法
func sha1Hash(msg string) (hashData []byte) {
h := sha1.New()
io.WriteString(h, msg)
hashData = h.Sum(nil)
return
}
func main() {
msg := "This is the message to hash!"
// sha1
sha1Data := sha1Hash(msg)
fmt.Printf("SHA1: %x\n", sha1Data)
}