<Golang>MD5、SHA256等哈希算法介绍、应用场景及具体实现

本文介绍了MD5和SHA256两种单向散列函数,讨论了它们的特性、应用场景,并提供了Golang的实现示例,包括用于文件校验和防止篡改。同时,文章提到了数字签名、伪随机数生成和秒传等领域的应用。
摘要由CSDN通过智能技术生成

版权声明:本文为作者原创,如需转载,请注明出处https://blog.csdn.net/weixin_42940826

前言

MD5和SHA256是非常常用的两种单向散列函数,虽然MD5在2005年已经被中国密码学家王小云攻破,但是曾经也是叱咤风云的被大规模使用,现在比较常用的是SHA256算法,两种算法在go语言中已经被封装好,调用方法相同。

称谓: 单向散列函数, 哈希函数, 杂凑函数, 消息摘要函数

输入: 原像

输出: 散列值, 哈希值, 指纹, 摘要


三大特性:

1. 将任意长度的数据转换成固定长度的数据
(无论输入的是一个比特还是一亿个比特,输出的结果长度固定,具体长度根据不同算法决定,比如MD5输出的长度就是128位)
2. 很强的抗碰撞性
(输出的结果唯一,也就是很难找到H(x1)=H(x2))
3. 不可逆
(目前没有任何方法可以通过散列值找到对应的输入值,也就是不能通过H(X)的值找到对应的X)


常见应用场景:

1、数据库中保存用户密码
比如前段时间频频爆出一些公司的数据库被爆,用户的账户密码以明文存在,大量资料流出这样的做法是极其不负责和危险的。
最好的方法就是将用户的密码通过单向散列函数输出到数据库,每次登录时对比散列值即可。由于单向散列函数的不可逆性,就算数据库被盗取,也没有办法得到用户的信息。
(某些自称破解单向散列函数的网站使用的方法其实是低级的穷举法,保存大量常用明文的散列值,这样做是很愚蠢的。有很多方法可以应对,比如一种叫做“加盐”的常用方法,将用户的信息后面统一加上诸如$%*^&这样的字符,然后计算散列值存入数据库中,或者可以计算散列值的散列值,这样可以保证绝对的安全性。)

2、防止文件篡改
目前大部分提供下载服务的网站都有提供文件的SHA256值,这是因为单向散列函数具备防篡改的效果,若是下载的文件的SHA256和网站提供的值不符,则可能此文件已经遭到了修改,可能含有病毒或者是盗版等等。。。接下来的代码中我们也会来实现计算文件的SHA256值。

3、 数字签名
在进行数字签名时也会使用单向散列函数。
数字签名是现实社会中的签名和盖章这样行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接使用数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值使用私钥加密,得到的就是数字签名。

4、伪随机数生成器
使用单向散列函数可以构造伪随机数生成器。
密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。

5、秒传
很多诸如某云盘,某网盘这样的公司利用单向散列函数的特性实现秒传的效果。
单向散列函数就像文件的指纹一样,当用户上传文件时,首先计算一下此文件的单向散列值,将此值在数据库中进行查找,若存在相同值,证明此用户上传的文件已经存在相同的,所以无需上传,共享即可。如此可大幅降低服务器负载,大幅缩减存储空间,实现去重的效果。


golang实现:

先来看一下golang中提供的有关函数接口

// 第一种方式, 直接调用sum
// 适用于数据量比较小的情况
func Sum(data []byte) [Size]byte

// 第二种方式
// 1. 创建哈希接口对象
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值