奇妙的安全旅行之MD算法

hi,大家好,今天我们开始介绍消息摘要算法中的MD(Message Digest)算法,MD算法家族包括:MD2,MD4,MD5,MD算法生成的消息摘长度要都是128位的。

其中MD5算法是消息摘要算法的第五个版本,是当前最典型的消息摘要算法,它是由MD2和MD4算法改进而来的。不论是哪一种MD算法,它们都需要获得一个随机长度的信息并产生一个128位长度的信息摘要。如果将这个128位的二进制摘要信息换算成十六进制,就可以得到一个32位长的字符串,所以平时我们见到的大部分MD5算法生成的字符串都是一个32位长的十六进制的字符串。

从安全性上说:MD5 > MD4 > MD2,MD5算法安全性最高。

MD 算法家族的发展史:

MD2 算法:

1989年,著名的非对称算法RSA发明人之一麻省理工学院教授罗纳德·李维斯特教授开发了MD2算法。这个算法首先对信息进行数据补位,使信息的字节长度是16的倍数;再以一个16位的检验和做为补充信息追加到原信息的末尾;最后根据这个新产生的信息计算出一个128位的散列值,MD2算法由此诞生。

MD4 算法:

1990年,罗纳德·李维斯特教授开发出较之MD2算法有着更高安全性的MD4算法。在这个算法中,我们仍需对信息进行数据补位。不同的是,这种补位使其信息的字节长度加上448个字节后成为512的倍数(信息字节长度mod 512 = 448)。此外,关于MD4算的处理和MD2算法有很大的差别,但最终仍旧会获得一个长度为128位的散列值。MD4算法对后续消息摘要算法起到了推动作用, 许多比较有名的消息摘要算法都是在MD4算法的基础上发展而来的,例如MD5、SHA-1、RIPE-MD和HAVAL算法等。

MD5 算法:

1991年,继MD4算法后,罗纳德.李维斯特教授开发了MD5算法,最终将MD系列算法推向了成熟。MD5算法经MD2和MD4算法发展而来,算法复杂程度和安全强度也大大提高,但这些MD算法的最终结果都是产生一个128位长度的信息摘要,这也是MD系列算法的主要特点。

MD 算法的对比

算法摘要长度(bit)实现方
MD2128JDK、Bouncy Castle、Commons Codec
MD4128Bouncy Castle
MD5128JDK、Bouncy Castle、Commons Codec
  • MD2,MD4,MD5 计算的结果都是是一个128位(即16字节)的散列值,用于确保数据信息的完整一致性。
  • MD2 算法加密速度较慢但相对安全,MD4 速度很快,但安全性下降,MD5 则比 MD4 更安全、速度更快。
  • MD5 算法被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。
  • 2004年,证实MD5 算法无法防止碰撞攻击,因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。对于需要高度安全性的数据,一般建议改用其他更安全不容易破解的算法,如SHA-2。

MD 算法实现

JDK提供的 MD2 和 MD5 算法实现

Java的jdk中提供了MD2和MD5算法的实现,如果想实现MD5,可以直接使用JDk提供的方法来实现,示例代码如下所示:

// MD2加密
public static String encodeMd2(byte[] data) throws Exception {// 初始化MessageDigestMessageDigest md = MessageDigest.getInstance("MD2");// 执行摘要信息byte[] digest = md.digest(data);// 将摘要信息转换为32位的十六进制字符串return new HexBinaryAdapter().marshal(digest);
}// MD5加密
public static String encodeMd5(byte[] data) throws Exception {// 初始化MessageDigestMessageDigest md = MessageDigest.getInstance("MD5");// 执行摘要信息byte[] digest = md.digest(data);// 将摘要信息转换为32位的十六进制字符串return new HexBinaryAdapter().marshal(digest);
}
Bouncy Castle 补充的 MD4 算法实现

JDK中不提供对 MD4 算法的实现,Bouncy Castle帮我们实现了,需要引入Bouncy Castle的相关包,示例代码如下所示:

// MD4加密
public static String encodeMd4(byte[] data) throws Exception {// 加入BouncyCastle的支持Security.addProvider(new BouncyCastleProvider());// 初始化MessageDigestMessageDigest md = MessageDigest.getInstance("MD4");// 执行摘要信息byte[] digest = md.digest(data);// 将摘要信息转换为32位的十六进制字符串return new String(Hex.encode(digest));
}
Commons Codec 的MD算法实现

Commons Codec 提供了 MD系列算法的消息摘要算法的实现,在使用时可以通过封装的工具类-----DigestUtils类来进行操作。DigestUtils类是对Sun提供的MessageDigest类的一次封装,提供了完整的实现方法。下面是关于MD5实现的示例:

// MD5加密 返回十六进制的字符串
public static String encodeMd5HexWithCodec(byte[] data) throws Exception {return DigestUtils.md5Hex(data);
}// MD5加密,返回十进制的字节数组
public static byte[] encodeMd5WithCodec(byte[] data) {return DigestUtils.md5(data);
}

获取完整代码请访问:

https://github.com/ForTheDevelopers/JavaSecurity

应用场景

由于MD5算法具有简单快捷等特性,在实际应用中还是有很多场景中会使用,下面列举一些我们常见的场景。

1、用户密码

MD5算法可以用于用户注册登录时的密码验证,不过为了增加MD5被破解的难度,可以进行加盐或乱序处理,也可以只取一半MD5的长度或者其他策略。MD5是不可逆算法,只要保证算法不变,就能和数据库中的md5相匹配。不过MD5算法不是完全安全的,还是可能被破解的,可以作为一个低安全级别的应用场景。

2、文件完整性的校验

当我们在下载一个文件时,通常会在下载文件页面中显示这个文件的MD5值,在本地下载完成后可以对下载的文件进行MD5计算,并将两个MD5值进行比较,如果一致则说明文件完整没有被篡改,说明是网站的源文件。这种可以有效防止文件被黑客利用进行病毒的植入,一旦文件被篡改,MD5值就不一样了。例如,我们在Oracle官方下载jdk时通常会看到这个页面:

md5

3、搜索

以某网站内容搜索为例,可以使用搜索关键词的MD5值来设置索引,例如你输入我是开发者FTD 公众号 和 输入**公众号 我是开发者FTD **搜索的结果是不一样的,因为这两个关键词对应的MD5值是不一样的,我们可以根据这个MD5值去定义唯一的搜索关键词。

4、著作版权

当一个视频或者音频创作出来的时候它的MD5值是唯一的,若以后有翻录等版本出来,即使画质,声音,文件名都一样,但是他们的MD5值验证是不一样的,所以可以验证版权。还比如用某一账户下载的视频它的账户信息也回和视频一起MD5值操作,如果以后这个人私自传播通过MD5值就可以去数据库中查找泄露版权的情况。

5、订单信息的校验

现在支付工具对大家都比较熟悉了,你有没有想过如果在支付过程中,黑客将订单拦截并修改了支付金额,是不是就可以免费或很便宜的买东西了呢?这时服务器端就可以使用MD5来校验订单的真实性,看看收到的订单是不是最初用户下单时的订单,如果发现订单被修改了,则支付失败,有效的预防了商家的损失。

MD5算法的不足

上面说到了MD5算法抗碰撞性的特点,因此在实际应用中MD5被认为是非常安全的,但是在2004年,咱们中国山东大学的王小云教授以及她的同事在美国加州举办的密码学会议上宣布破解了MD5算法,其实也不是真正的破解,而是非常明显的加快了寻找一对碰撞的速度,利用她们的技术,可以在几个小时内就找到一对碰撞,极端情况下,甚至在2008年计算机的计算能力上,几秒钟就可以找到一对碰撞。

因此MD5算法的安全性就引起人们的担忧,所以在对安全性要求较高的场合,不建议直接使用MD5算法。

总结

虽然MD5算法现在看来并不是绝对安全的,但是MD5算法的简单快速便捷性也是其他算法无法比拟的,MD5算法还是有很多场景在使用,大家也可以根据自己实际业务的需求来选择是否使用MD5算法。

全性要求较高的场合,不建议直接使用MD5算法。**

总结

虽然MD5算法现在看来并不是绝对安全的,但是MD5算法的简单快速便捷性也是其他算法无法比拟的,MD5算法还是有很多场景在使用,大家也可以根据自己实际业务的需求来选择是否使用MD5算法。

创作不易,如果大家喜欢本文,欢迎点赞,转发,你的关注是我们继续前进的动力_

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

的图层类型有哪些_东莞都市领航平面设计培训班都学习哪些内容?

平面设计的工作稳定性是很高的,经济繁荣时期毫无疑问,即使经济下滑,仍不会有很大影响,以前两年为例,北美的大规模裁员浪潮,给高科技行业带来巨大冲击,放慢了高科技产品的开发速度,当…

dockerfile拉取私库镜像_还在用Alpine作为你Docker的Python开发基础镜像?其实Ubuntu更好一点...

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_173一般情况下,当你想为你的Python开发环境选择一个基础镜像时,大多数人都会选择Alpine,为什么?因为它太小了,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接…

2020,再见;2021,我来了!

现在是2021年1月16日下午16点33分,星期六。此时北京正在通报昨日新冠肺炎新增病例情况,这种每天戴口罩的鬼日子还不知道什么时候能结束。最近由于天气变冷,病毒更容易存活和传播,最近一个月就突然又变的非常紧张起来了&#xff0c…

cuda tensorflow版本对应_Windows10下安装tensorflow-gpu(2.2.0)安装教程(避坑+保姆式教学)...

本文实现了Windows10下GPU版本的tensorflow2.2.0的安装,用到的软件主要包括:CUDA 10.2 cuDNN Anaconda tensorflow-gpu 2.2.0。(注:此教程在Win7环境下也同样适用!另附报错缺少cudart64_101.dll的解决办法&#xff…

奇妙的安全旅行之DES算法(二)

hi,大家好,上一节我们详细介绍了对称加密算法DES的基本内容,由于明文的长度不固定,而加密算法只能处理特定长度的一块数据,所以就需要对比较长的明文进行分组后再加密,但是分组后,最后一组的长度…

c++创建虚拟串口_linux虚拟串口控制器驱动实现——适用于无开发板学习串口驱动...

在上一章我们已经说明了uart驱动的开发流程,本章我们就不再介绍uart相关的接口实现,仅通过实现一个虚拟的串口控制器程序,用以说明虚拟串口的开发流程。本次开发的虚拟串口提供的功能如下:提供两个串口实例串口名称的前缀为vttyU为…

奇妙的安全旅行之AES算法

hi,大家好,今天开始我们来介绍一下对称加密算法中的AES算法。 AES简介 AES(英语:Advanced Encryption Standard,缩写:AES),即高级加密标准,在密码学中又称Rijndael加密…

axios vue 回调函数_前端Vue 面试题大全

点蓝色字关注“程序员报刊” 「学习 新闻 招聘 」vue的底层原理?vue组件之间的通信?JS中判断数据类型的方法有几种?最常见的判断方法:typeof判断已知对象类型的方法:instanceof根据对象的constructor判断:constructor无敌万能的…

奇妙的安全旅行之RSA算法

hi,大家好,我是开发者FTD。今天我们开始介绍非对称加密算法。非对称加密算法区别于对称加密算法的主要特点是,非对称加密算法有两个密钥:公钥 (public key) 和私钥 (private key)。公钥和私钥是一对密钥,如果用公钥对数…

易语言多级指针读取_C语言指针难吗?纸老虎而已,纯干货讲解(附代码)

作者:21IC网络整理,排版:晓宇微信公众号:芯片之家(ID:chiphome-dy)指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面…

奇妙的安全旅行之DSA算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法中的DSA算法。 DSA 算法简介 DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard) 数字签…

lisp语言画阿基米德线_【R语言】如何将照片快速转换为素描

【R语言】如何将照片快速转换为素描(三行代码给老婆(划掉)画一张素描)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com最近发现了一个比较好玩的包,叫做sketcher这个包的作用就是将图片转化成素描的样式以下是…

2021年程序员1月薪资统计,你在哪一档?

hi,大家好,我是开发者FTD。2021年1月份马上就要结束了,再过一周多春节也即将来临,春节后估计又是一波跳槽高峰,那我们一起来看一下当前程序员的薪资状况,让大家对于年后是否要换工作也有个心理预期吧。 注&…

海康sip服务器地址_完整SIP/SDP媒体协商概论SDP基础使用要求

接完整SIP/SDP媒体协商概论-SDP基础-核心定义全解。上一个章节笔者介绍了关于SDP的一些核心概念(第一章节和第二章节),今天,我们继续在此之间讨论SDP的其余基础内容(从第三章节开始)。在以下讨论中,笔者会介绍关于SDP的使用,SDP的…

一月:你今年还回家过年吗?

hi,大家好,我是开发者FTD。一月份对于我来说,是工作和生活渐渐明朗的一个月,之前迷茫的状态感觉在这一个月开始慢慢消失,并让整个人的精神状态开始转变。2021年才刚刚开始,大家也可以对自己新的一年进行一个…

6个座位办公室最佳位置_2021最佳动力艇大奖:6个类别29个入围名单揭晓

年度最佳动力艇大奖由英国杂志《Motor Boat & Yachting》(MBY)主办,经(MBY)深思熟虑,评委们缩小了2021年度最佳动力艇大奖的决赛入围名单。由于旅行限制,今年的形式会有所不同,不能像往年一样测试那么多的船。因此&#xff0c…

奇妙的安全旅行之ECC算法

hi,大家好,我是开发者FTD。今天我们来介绍一下非对称加密算法的ECC算法。 ECC 算法简介 ECC 是 Elliptic Curves Cryptography 的缩写,意为椭圆曲线密码编码学。和RSA算法一样,ECC算法也属于公开密钥算法。最初由 Koblitz 和 Mi…

奇妙的安全旅行之国密算法

hi,大家好,我是开发者FTD。今天我们来介绍一下我们国家密码局制定的加密算法 — 国密算法。 为什么要制定国密算法? 密码算法是保障信息安全的核心技术,尤其是我国最关键的银行业核心领域长期以来都是沿用MD5、3DES、SHA-256、R…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(二)

远控木马 SET 同时集成了木马生成工具,可以生成木马并调用MSF框架对远程主机进行控制。直接使用MSF生成木马并控制主机的可参考之前另一篇博文:渗透测试-Kali入侵Win7主机。 控制主机 1、运行 SET,选择创建攻击载荷和监听器: 2…

wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测

前言每个NAS系统都应该配备足够容量的硬盘,以满足数据存储需求。WD Red 西数红盘存储空间高达14TB,可以为需要构建大容量和高性能NAS存储方案的用户提供解决方案。WD Red西数红盘14T运行安静且热量低,其采用的NASware 3.0技术提高了兼容性、集…