这里是修真院后端小课堂,每篇分享文从java
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】程序员
八个方面深度解析后端知识/技能,本篇分享的是:算法
【return的用法是什么?若在for循环中,还会执行下一次循环吗?】数据库
【修真院java小课堂】什么叫MD5,MD5一般作什么用处,为何MD5不可逆,用作密码加密的时候仍然可能会被解密?后端
你们好,我是IT修真院成都分院第13期的学员,一枚正直纯洁善良的java程序员,今天给你们分享一下,修真院官网java任务5,深度思考中的知识点——什么叫MD5,MD5一般作什么用处,为何MD5不可逆,用作密码加密的时候仍然可能会被解密?安全
(1)背景介绍:服务器
什么是MD5?函数
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被普遍使用的密码散列函数,能够产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。工具
密码散列函数(Cryptographic hash function),又译为加密散列函数,是散列函数的一种。网站
MD4算法在安全上有大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导做用,好比MD5加密算法.
(2)知识剖析:
主要应用:
2.1一致性验证
MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。好比,在Unix下有不少软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中一般只有一行文本,大体结构如:
MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515
MD5将整个文件看成一个大文本信息,经过其不可逆的字符串变换算法,产生了这个惟一的MD5信息摘要。
举例描述:
咱们经常在某些软件下载站点的某软件信息中看到其MD5值,它的做用就在于咱们能够在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)作一次MD5校验,以确保咱们得到的文件与该站点提供的文件为同一文件。
具体来讲文件的MD5值就像是这个文件的“数字指纹”。每一个文件的MD5值是不一样的,若是任何人对文件作了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。好比下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用我这个算法从新计算下载文件的MD5值,经过比较这两个值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。
利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。
2.2数字签名
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,而后你能够传播这个文件给别人,别人若是修改了文件中的任何内容,你对这个文件从新计算MD5时就会发现(两个MD5值不相同)。若是再有一个第三方的认证机构,用MD5还能够防止文件做者的“抵赖”,这就是所谓的数字签名应用。
2.3安全访问认证
MD5还普遍用于操做系统的登录认证上,如Unix、各种BSD系统登陆密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它相似的算法)经Hash运算后存储在文件系统中。当用户登陆的时候,系统把用户输入的密码进行MD5 Hash运算,而后再去和保存在文件系统中的MD5值进行比较,进而肯定输入的密码是否正确。经过这样的步骤,系统在并不知道用户密码的明码的状况下就能够肯定用户登陆系统的合法性。这能够避免用户的密码被具备系统管理员权限的用户知道。
2.4算法原理
对MD5算法简要的叙述能够为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,通过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值
(3)常见问题:
(4)解决方案:
(5)编码实战:
@Test
public void MD5Test(){
String password = "!ytd1129097428";
String md1 = MD5Util.MD5(password);
String md2 = MD5Util.generate(password);
System.out.println("加密前:"+password);
System.out.println("普通MD5加密后:"+md1);
System.out.println("加盐MD5加密后:"+md2);
System.out.println("比较原文和加盐MD5加密以后是否一致:"+MD5Util.verify(password,md2));
}
输出结果:
加密前:!ytd1129097428
普通MD5加密后:add4ff4fb01ace59713390dc5876d5d0
加盐MD5加密后:96b911880466d91d3244f37bd56c4531967c28d65181f191
比较原文和加盐MD5加密以后是否一致:true
(6)拓展思考:
关于撞库破解:
这是几率极低的破解方法,原理就是:
1.创建一个大型的数据库,把平常的各个语句,经过MD5加密成为密文,不断的积累大量的句子,放在一个庞大的数据库里.
2.好比一我的拿到了别人的密文,想去查询真实的密码,就须要那这个密文去到提供这个数据库的公司网站去查询.
在线MD5解密: http://www.cmd5.com/
(7)参考文献:
https://www.zhihu.com/questio...
https://blog.csdn.net/dingsai...
https://baike.baidu.com/item/MD5
(8)更多讨论:
Q1:1.MD5码不是128位的吗?为什么得出来的乱码有的是32位的?
A1:128位是指二进制位。二进制太长,因此通常都改写成16进制,每一位16进制数能够代替4位二进制数,因此128位二进制数写成16进制就变成了128/4=32位。
Q2:2.MD5特色是什么?
A2:1.长度固定:
无论多长的字符串,加密后长度都是同样长
做用:方便平时信息的统计和管理
2.易计算:
字符串和文件加密的过程是容易的.
做用: 开发者很容易理解和作出加密工具
3.细微性:
一个文件,无论多大,小到几k,大到几G,你只要改变里面某个字符,那么都会致使MD5值改变.
做用:不少软件和应用在网站提供下载资源,其中包含了对文件的MD5码,用户下载后只须要用工具测一下下载好的文件,经过对比就知道该文件是否有过更改变更.
4.不可逆性:
你明明知道密文和加密方式,你却没法反向计算出原密码.
做用:基于这个特色,不少安全的加密方式都是用到.大大提升了数据的安全性
Q3:3.什么是MD5加盐?
A3:好比个人银行密码是”12345”
1.获得的MD5是:827ccb0eea8a706c4c34a16891f84e7b
2.一我的截取到这个密文,那么经过撞库确定容易撞出12345.
3.咱们要作的就是加盐,银行密码仍是”12345”,而后我把银行密码加上我特定的字符串才计算MD5 因此密码仍是那个密码,可是变成求”12345密码加密987”的MD5值,而后再获得MD5,那么这个MD5起码能够确认那个数据库不会有.
(9)鸣谢:
感谢观看。
(10)结束语:
今天的分享就到这里啦,欢迎你们点赞、转发、留言、拍砖