您现在的位置是:首页 > 学习笔记 > 密码学密码学
单向散列函数
冰山2019-09-28【密码学】人已围观
简介1. 单向散列函数
1.1 定义
1.2 关于术语
1.3 单向散列函数的性质
1.4 单向散列函数的实际应用
1.4.1检测软件是否被篡改
1.4.2消息认证码
1.4.3数字签名
1.4.4伪随机数生成器
1.4.5一次性口令
1.5 常用的单向散列函数
1.5.1 MD4、MD5
1.5.2 Golang中使用MD5
1.5.3 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512标准
具备单向性
单向散列函数必须具备单向性(one-way)。单向性指的是无法通过散列值反算出消息的性质。根据消息计算散列值可以很容易,但这条单行路是无法反过来走的。
正如同生活中将玻璃砸得粉碎很容易,但却无法将碎片还原成完整的玻璃,根据消息计算出散列值很容易,但根据散列值却无法反算出消息。
在这里需要注意的一点是,尽管单向散列函数所产生的散列值是和原来的消息完全不同的比特序列,但是单向散列函数并不是一种加密,因此无法通过解密将散列值还原为原来的消息。
在这里需要注意的一点是,尽管单向散列函数所产生的散列值是和原来的消息完全不同的比特序列,但是单向散列函数并不是一种加密,因此无法通过解密将散列值还原为原来的消息。
1.4 单向散列函数的实际应用
下面来看一下实际应用中单向散列函数的例子。
1.4.1检测软件是否被篡改
我们可以使用单向散列函数来检测自己下载的软件是否被篡改过。
很多软件,尤其是安全相关的软件都会把通过单向散列函数计算出的散列值公布在自己的官方网站上,用户在下载到软件之后,可以自行计算散列值,然后与官方网站上公布的散列值进行对比,通过对比散列值,用户可以确认自己所下载到的文件与软件作者所提供的文件是否一致,前面我们说到了,哪怕是00改成01,散列值也会发生变化。
这样的方法,在可以通过多种途径得到软件的情况下非常有用。为了减轻服务器的压力,很多软件作者都会借助多个网站(镜像站点)来发布软件,在这种情况下,单向散列函数就会在检测软件是否被篡改方面发挥重要作用。

使用单向散列函数可以构造消息认证码。
消息认证码是将“发送者和接收者之间的共享密钥”和“消息,进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。
在进行数字签名时也会使用单向散列函数。
数字签名是现实社会中的签名(sign)和盖章这样的行为在计算机世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。
使用单向散列函数可以构造伪随机数生成器。
密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。
使用单向散列函数可以构造一次性口令(one-time password)。
一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。
MD4是由Rivest于1990年设计的单向散列函数,能够产生128比特的散列值。不过,随着Dobbertin提出寻找MD4散列碰撞的方法,因此现在它已经不安全了。
MD5是由Rwest于1991年设计的单项散列函数,能够产生128比特的散列值。
MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了。
MD4和MD5中的MD是消息摘要(Message Digest)的缩写。
需要导入的包:
import (
"crypto/md5"
"encoding/hex"
)
计算Md5的方式1:
func getMD5_1(str []byte) string {
// 1. 计算数据的md5
result := md5.Sum(str)
fmt.Println(result)
fmt.Printf("%x\n", result)
// 2. 数据格式化为16进制格式字符串赏
很多软件,尤其是安全相关的软件都会把通过单向散列函数计算出的散列值公布在自己的官方网站上,用户在下载到软件之后,可以自行计算散列值,然后与官方网站上公布的散列值进行对比,通过对比散列值,用户可以确认自己所下载到的文件与软件作者所提供的文件是否一致,前面我们说到了,哪怕是00改成01,散列值也会发生变化。
这样的方法,在可以通过多种途径得到软件的情况下非常有用。为了减轻服务器的压力,很多软件作者都会借助多个网站(镜像站点)来发布软件,在这种情况下,单向散列函数就会在检测软件是否被篡改方面发挥重要作用。

1.4.2消息认证码
使用单向散列函数可以构造消息认证码。
消息认证码是将“发送者和接收者之间的共享密钥”和“消息,进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。
1.4.3数字签名
在进行数字签名时也会使用单向散列函数。
数字签名是现实社会中的签名(sign)和盖章这样的行为在计算机世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。
1.4.4伪随机数生成器
使用单向散列函数可以构造伪随机数生成器。
密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。
1.4.5一次性口令
使用单向散列函数可以构造一次性口令(one-time password)。
一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。
1.5 常用的单向散列函数
1.5.1 MD4、MD5
MD4是由Rivest于1990年设计的单向散列函数,能够产生128比特的散列值。不过,随着Dobbertin提出寻找MD4散列碰撞的方法,因此现在它已经不安全了。
MD5是由Rwest于1991年设计的单项散列函数,能够产生128比特的散列值。
MD5的强抗碰撞性已经被攻破,也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也已经不安全了。
MD4和MD5中的MD是消息摘要(Message Digest)的缩写。
1.5.2 Golang中使用MD5
需要导入的包:
import (
"crypto/md5"
"encoding/hex"
)
计算Md5的方式1:
func getMD5_1(str []byte) string {
// 1. 计算数据的md5
result := md5.Sum(str)
fmt.Println(result)
fmt.Printf("%x\n", result)
// 2. 数据格式化为16进制格式字符串
微信扫一扫~
支付宝扫一扫~
很赞哦! ()
随机图文
非对称加密
1.非对称加密 1.1 非对称加密通信流程 1.2 RSA 1.2.1 RSA加密 1.2.2 RSA解密 1.3Go语言中实现生成公钥和私钥 1.3.1生成私钥操作流程 1.3.2生成公钥操作流程 1.4Go语言中使用RSA进行加密、解密 1.4.1公钥加密操作步骤 1.4.2私钥解密操作步骤单向散列函数
1. 单向散列函数 1.1 定义 1.2 关于术语 1.3 单向散列函数的性质 1.4 单向散列函数的实际应用 1.4.1检测软件是否被篡改 1.4.2消息认证码 1.4.3数字签名 1.4.4伪随机数生成器 1.4.5一次性口令 1.5 常用的单向散列函数 1.5.1 MD4、MD5 1.5.2 Golang中使用MD5 1.5.3 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512标准分组密码
1. 分组密码的模式 1.1分组密码 1.2模式 1.3明文分组和密文分组 2.主要模式 2.1ECB 模式 2.2XOR运算 2.3CBC模式 2.4CFB 模式 2.5OFB 模式 2.6CTR 模式 2.7总结数字签名
1.数字签名 1.1 从消息认证码到数字签名 1.2 签名的生成和验证 1.3 非对称加密和数字签名 1.4数字签名的方法 1.5通过RSA实现数字签名 1.5.1 生成数字签名 1.5.2 验证数字签名 1.6 通过椭圆曲线实现数字签名 1.6.1秘钥对称的生成, 并保存到磁盘 1.6.2使用私钥进行数字签名 1.6.3使用公钥验证数字签名 1.7 数字签名无法解决的问题