MD5和SHA-1
MD5和SHA-1都是我们耳熟能详的术语了,很多人可能知道他们跟加密有关系,但是他们是怎么做到加密的,他们各自的特点又是什么。我来简单的讲一讲。
MD5和SHA-1都被称作哈希(Hash)函数,用过Java语言的人对这个术语应该相当熟悉。Java类库里的Object类定义了hashCode这个函数,但是java的概念略有不同。正式的哈希函数的定义是“把任意长度的数据计算成固定长度的数据”。也就是说函数的输入是任意长的,输出总是固定长度的。MD5和SHA-1是两种加密用哈希函数,MD5的返回值总是128bit的,SHA-1的返回值是160bit,都是固定长度。MD5如果按十六进制表示的话是32位十六进制的数,SHA-1是40位十六进制的数。
你可以用下面两个网站试用这两个函数,这样有个感性认识:
MD5:http://md5-hash-online.waraxe.us/
SHA-1:http://sha1-hash-online.waraxe.us/
你输入任意长度的字符串,都会返回给你相应固定长度的十六进制返回值。这两个函数的返回值都被称为信息摘要(Message Digest,实际上MD就是Message Digest的缩写)。
那么两个函数为什么可以用在加密上呢?因为他们都有这几个特性
- 都是“不可逆”的函数。不存在一个算法能够由哈希值倒算出原始信息。
- 对原始信息的任何一点改变都会导致结果的哈希值巨大的不同。举个例子,假如原始数据是几百万字的文章,你在其中哪怕改动一个标点,计算出的哈希值都会有很大的变化。
- 运算代价是相对较低的。普通的AMDOpteron 2.2GHz的芯片,每秒可以计算出335MB数据的MD5值,可以计算192MB数据的SHA-1值。 参见https://en.wikipedia.org/wiki/SHA-1#Comparison_of_SHA_functions。
- 类似于1,除非通过蛮力的穷举法,否则无法找到两段不同的信息而有相同的哈希值。(这一点现在已被证明是不成立的了,请看后文)
那么这两个函数的特点在哪里呢?特点在于都能“通过哈希值唯一标识原信息”。这个怎么讲,就是比如原始信息是A,我知道原始信息的哈希值Ha,如果我有另一段信息,这段信息的哈希值也是Ha的话,我就能“以极大的可靠性”断定这另一段信息就是A。也就是说哈希值能“唯一”标识原始信息。原因是什么呢?
- 两段不同信息“碰巧”有着相同的哈希值的概率是很低的,对于MD5来说是2的128次方分之一,这个数字是多小呢:太阳的表面积是6万亿平方公里,一个原子的截面积大约是1平方纳米,假设你是一个原子,把你放在56个太阳中任意一个的表面,这个概率是我在这56个太阳上随意指定一点,正好点中你的概率,而你是一个小小小的原子。对SHA-1来说,这个概率就更低了。
- 那么有没有办法人工伪造一段信息正好有Ha这个哈希值呢?根据上面的1和4,这个可能性是很低的,要通过穷举法的巨大的运算量才能做到。
那么他们通常有什么应用呢?
1. 密码加密(很常用的一种用法)
比如我有一个网站,用户注册的时候会输入用户名密码,大家都知道如果密码是明文的方式存储在数据库里的话,如果这个数据泄漏或者内部人员作恶的话,会造成信息安全问题。所以通用的做法是把用户输入的密码做MD5或SHA-1的运算,把返回的固定长度的哈希值存储在数据库中。比如用户的密码是”bigcat”,实际存储在数据库中的值是它的SHA-1的值a748bf7fee2289b22d448ed8efde10a68f7d1cf9。因为这两个函数的“不可逆”性,所以任何人拿到这个hash值是无法知道用户的明文密码的。
2. 文件校验
在网上下载大尺寸文件的时候常见到网站同时会提供这个文件的MD5的值,它的作用是用户下载后可以在下载文件基础上计算MD5的值,如果和网站提供的MD5是相同的说明文件在下载过程中没有损坏或者说文件没有被恶意网站修改。
3. 工作量证明(Proof ofWork)
上面两种应用比较常见,工作量证明就不那么常见了。这里有一篇关于工作量证明的很好的文章:http://www.zhihu.com/question/22369364/answer/23600737。
曾经(在2005年之前),这两个哈希函数被认为是很好的Message Digest(信息摘要)函数,它们的返回值能够“唯一”标识原始信息,而在2005年,中国山东大学的王小云教授的惊天动地的发现颠覆了这一国际加密学的基础。详情请看我后续文章。
上文介绍了MD5和SHA-1函数,我现在来讲一讲这两个函数作为消息摘要函数的安全上的缺陷是什么。
一直到2005年,这两个函数都在国际密码学界被认为是理想的消息摘要函数,直到山东大学的王小云教授发现了这两个函数的致命缺陷:它们都易受冲撞攻击(collision attack)。
什么是冲撞攻击呢?
首先,摘要函数理想上应该符合:非常难找到两个不同的信息而他们的摘要是相同的。这里非常难是指实现上非常困难,理论上讲用穷举法当然可以做到,但是要求的运算量过大使得现实上是不可能的。所谓冲撞攻击是指一种相对“廉价”的方法能找到两个有相同摘要的不同信息。
实际上对于MD5来说,由于它的摘要信息位数比较短(128 bit),现在用普通的计算机可以在几小时甚至几分钟之内找到冲撞对,这就是相当“廉价”了。而对于SHA-1(160 bit)来说,王小云教授的成果证明可以在2的69次方次尝试后找到冲撞对(这个结果之后在被不断地被改进),但这个计算量仍然过大,以当代的计算机运算能力来说,现实上仍然很难实现(需要的运算量大意味着需要的资金大)。根据这篇文章https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html,即使到2018年,找到一个SHA-1冲撞对所需要的资金是17万3千美元,现在的2016年需要的就更多了。
那么能找到冲撞对,意味着什么样的安全漏洞呢?比如可以利用MD5的这个漏洞来伪造数字签名,看https://en.wikipedia.org/wiki/Collision_attack#Digital_signatures。简单的说就是我造两份文件(一份正常文件,一份恶意文件)它们有着相同的MD5 hash,而一般数字签名是针对文件的消息摘要而不是文件全文来做的,我就可以拿着正常文件取得消息摘要的签名认证(证明这个文件是合法的),然后我拿着恶意文件和这个取得认证的消息摘要,受攻击者就会的会误认为这个恶意文件是取得签名认证的。
所以,对MD5的冲撞攻击是比较容易的,对SHA-1的冲撞攻击相对代价较大,但是随着机算机能力年年的发展正变得越来越容易实现。
上面我们讲的是冲撞攻击,这里我要讲一个误区,看到很多文章把冲撞攻击和预镜像攻击(preimage attack)混淆,这是两个本质上不同的安全漏洞。什么是预镜像攻击呢,就是对于一个预指定的消息摘要(哈希值),我可以造一段信息出来使得这段信息的消息摘要就等于这个预指定的值。注意,冲撞攻击不能针对一个预指定的消息摘要。
预镜像攻击的应用,比如针对消息摘要常用的一种场景:用户密码明文保护,就是用户密码的明文并不存储下来,而是只存储用户密码的消息摘要。比如用户的密码明文是mypass,实际存储在应用里的只是这个密码的消息摘要a029d0df84eb5549c641e04a9ef389e5。
如果预镜像攻击是可行的话,我只要拿到用户密码的消息摘要,我就可以造另一个密码(注意根据消息摘要的“不可逆”原则,理论上你无法算得用户明文密码”mypass”,但是你可以造出另一个字符串组合)出来而有同样的摘要值a029d0df84eb5549c641e04a9ef389e5,我就能欺骗系统取得这个用户身份认证了。
但是,目前理论界还没有发现现实可行的预镜像攻击,参见https://en.wikipedia.org/wiki/Preimage_attack#Applied_preimage_attacks。也就是要进行预镜像攻击需要宠大的运算量(也就是资金)的支持,现实上不可行。所以如果你的系统是在用MD5或SHA-1加密用户密码的话,在一定时期内你仍然是安全的。
最后,在互联网上你能找到这样的MD5的“解密”工具,你输入MD5的值它可以给你“解密”成原文,比如:
稍微观察一下就会发现,这些网络只是用穷举法算出来非常庞大(几十TB到几百TB数据量)的信息和摘要对,来匹配你输入的MD5值,所以它们能“解密”的原始信息只是固定模式的字符串:如8位以下的小写英文字母的组合,等等。
真正的解密MD5和SHA-1消息摘要的办法还不存在。
MD5和SHA-1的更多相关文章
- 加密算法中BASE64、MD5、SHA、HMAC等之间的区别
http://blog.csdn.net/lplj717/article/details/51828692 根据项目需要了解了一下几种加密算法(参考其他博客),内容简要介绍BASE64.MD5.SHA ...
- md5和SHA校验码
md5已经不安全了,中国山东大学女学霸王小云破解了一系列密码,当真是巾帼不让须眉.说是破解,其实就是给你一个md5码,让你求出这个md5码所对应的原始信息,显然一个md5对应无数种原始信息.而md5的 ...
- 简要介绍BASE64、MD5、SHA、HMAC几种方法。
加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. ...
- 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
1.Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...
- C# 计算字符串/文件的哈希值(MD5、SHA)
原文 C# 计算字符串的哈希值(MD5.SHA) 已做修改 一.关于本文 本文中是一个类库,包括下面几个函数: /// 1)计算32位MD5码(大小写):Hash_MD5_32 /// 2)计算16位 ...
- 本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。
BASE64编码算法不算是真正的加密算法. MD5.SHA.HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法.我们通常只把他们作为加密的基础.单纯的以上 ...
- JAVA加密技术-----MD5 与SHA 加密
关于JAVA的加密技术有很多很多,这里只介绍加密技术的两种 MD5与 SHA. MD5与SHA是单向加密算法,也就是说加密后不能解密. MD5 ---信息摘要算法,广泛用于加密与解密技术,常用于文件校 ...
- BASE64、MD5、SHA、HMAC几种加密算法
本篇内容简要介绍BASE64.MD5.SHA.HMAC几种加密算法. BASE64编码算法不算是真正的加密算法. MD5.SHA.HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加 ...
- MD5 与 SHA 在 Delphi 中函数实现,加密密码
MD5 与 SHA 在 Delphi 中函数实现. 为了加密密码,必须使用一种算法,查询资料,比较好的方法是使用:MD5等算法,参考:Delphi XE8 支持MD5 第一种方式是:引用 System ...
- 生成、查看文件的MD5、SHA、SHA256值
生成文件的MD5.SHA.SHA256 Linux系统生成MD5.SHA.SHA256 md5sum file1.zip >> MD5.txt sha1sum file1.zip > ...
随机推荐
- ubuntu12上部署Django1.8.4+uwsgi+nginx超级详细流程配置到云服务器
环境: 系统:ubuntu12,系统自带默认有python2.7 框架:Django1.8.4,需要python2.7以上才能支持 前言: 用户浏览器发送http请求->nginx(静态文件 ...
- 在VS13上编译通过的代码放在12上编译-错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW
在VS13上编译通过的代码放在12上编译 遇到错误:l __dtoui3 referenced in function _event_debug_map_HT_GROW 1>------ 已启动 ...
- mysql之数据类型以及操作数据表
数据类型: 数据类型是指列.存储过程的参数.表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型. ———————————————————————————————————————— ...
- IE bug之location.href没有referer
使用js实现跳转一般会用 location.href="www.google.com"; 这样在一般的浏览器中可以在服务器端正常的获取referer,但是如果是IE浏览器就不正常了 ...
- java实现微信H5支付
前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自 ...
- SQL Server 索引维护:系统常见的索引问题
在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次DTA,里 ...
- Luogu 3237 [HNOI2014]米特运输
BZOJ 3573 发现当一个点的权值确定了,整棵树的权值也会随之确定,这个确定关系表现在根结点的总权值上,如果一个点$x$的权值为$v$,那么一步步向上跳后,到根节点的权值就会变成$x*$每一个点的 ...
- MSGPACK和PROTOBUF的故事(MSGPACK明显生产力不足)
作者曾经在2014年测试出MSGPACK的关键字和中文字符有很大的冲突,所以后来放弃了,本文为很多年前写的一个对比,后来我们一直在使用HTTP协议和PROTOBUF. 看看MSGPACK的文档,自称效 ...
- Windows7下使用sphinx生成开源文档(原)
作者这里以osgearth文档为例,感觉这种生成文档的方式比较好,生成的html文档是支持搜索的,感谢开源工作者的奉献.赞一个 1. 下载并安装python for windows:https://w ...
- javascript总结11:JavaScript的自增自减
1 自增自减 1.1 自增写法i++ 作用:在不参与运算的情况下,i++和++i都是在变量的基础加1 var n1 =123; //n1++ 等价于 n1 = n1 +1; ++n1 //等价于 n1 ...