您现在的位置是:首页 > 学习笔记 > 密码学密码学

单向散列函数

冰山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,散列值也会发生变化。

这样的方法,在可以通过多种途径得到软件的情况下非常有用。为了减轻服务器的压力,很多软件作者都会借助多个网站(镜像站点)来发布软件,在这种情况下,单向散列函数就会在检测软件是否被篡改方面发挥重要作用。



 

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进制格式字符串

 2/4   首页 上一页 1 2 3 4 下一页 尾页

  • 微信扫一扫~
  • 支付宝扫一扫~

很赞哦! ()

上一篇:非对称加密

下一篇:消息认证码

文章评论