您现在的位置是:网络安全 >>正文
MD5 加密安全吗?
网络安全56人已围观
简介MD5 是 Message Digest Algorithm 的缩写,译为信息摘要算法,它是 Java 语言中使用很广泛的一种加密算法。MD5 可以将任意字符串,通过不可逆的字符串变换算法,生成一个唯 ...
MD5 是加密 Message Digest Algorithm 的缩写 ,译为信息摘要算法,安全它是加密 Java 语言中使用很广泛的一种加密算法。MD5 可以将任意字符串,安全通过不可逆的加密字符串变换算法 ,生成一个唯一的安全 MD5 信息摘要,这个信息摘要也就是加密我们通常所说的 MD5 字符串 。那么问题来了,安全MD5 加密安全吗 ?加密
这道题看似简单,高防服务器其实是安全一道送命题,很多人尤其是加密一些新入门的同学会觉得 ,安全啊,安全MD5 首先是加密加密的字符串 ,其次是安全不可逆的 ,所以它一定是加密安全的 。如果你这样回答 ,亿华云那么就彻底掉进面试官给你挖好的坑了。
为什么呢?因为答案是“不安全” ,而不是“安全”。
1.彩虹表
MD5 之所以说它是不安全的,是因为每一个原始密码都会生成一个对应的固定密码,也就是说一个字符串生成的 MD5 值是永远不变的源码库。这样的话 ,虽然它是不可逆的,但可以被穷举 ,而穷举的“产品”就叫做彩虹表。
什么是彩虹表?彩虹表是一个用于加密散列函数逆运算的预先计算好的表, 为破解密码的散列值(或称哈希值、微缩图、云计算摘要、指纹 、哈希密文)而准备。一般主流的彩虹表都在 100G 以上 。这样的表常常用于恢复由有限集字符组成的固定长度的纯文本密码 。这是空间/时间替换的典型实践,比每一次尝试都计算哈希的暴力破解处理时间少而储存空间多,但却比简单的对每条输入散列翻查表的建站模板破解方式储存空间少而处理时间多 。
简单来说,彩虹表就是一个很大的 ,用于存放穷举对应值的数据表 。以 MD5 为例,“1”的 MD5 值是“C4CA4238A0B923820DCC509A6F75849B”,而“2”的 MD5 值是“C81E728D9D4C2F636F067F89CC14862C” ,那么就会有一个 MD5 的彩虹表是免费模板这样的 :
原始值
加密值
1
C4CA4238A0B923820DCC509A6F75849B
2
C81E728D9D4C2F636F067F89CC14862C
...
...
大家想想 ,如果有了这张表之后 ,那么我就可以通过 MD5 的密文直接查到原始密码了 ,所以说数据库如果只使用 MD5 加密 ,这就好比用了一把插了钥匙的锁一样不安全。
2.解决方案想要解决以上问题,我们需要引入“加盐”机制 。
盐(Salt):在密码学中 ,是指通过在密码任意固定位置插入特定的字符串 ,让散列后的结果和使用原始密码的散列结果不相符,这种过程称之为“加盐” 。
说的通俗一点“加盐”就像炒菜一样,放不同的盐,炒出菜的味道就是不同的 ,咱们之前使用 MD5 不安全的原因是 ,每个原始密码所对应的 MD5 值都是固定的 ,那我们只需要让密码每次通过加盐之后,生成的最终密码都不同,这样就能解决加密不安全的问题了。
3.实现代码加盐是一种手段、是一种解决密码安全问题的思路 ,而它的实现手段有很多种 ,我们可以使用框架如 Spring Security 提供的 BCrypt 进行加盐和验证,当然,我们也可以自己实现加盐的功能。
本文为了让大家更好的理解加盐的机制,所以我们自己来动手来实现一下加盐的功能。
实现加盐机制的关键是在加密的过程中,生成一个随机的盐值,而且随机盐值尽量不要重复,这时,我们就可以使用 Java 语言提供的 UUID(Universally Unique Identifier ,通用唯一识别码)来作为盐值,这样每次都会生成一个不同的随机盐值 ,且永不重复 。
加盐的实现代码如下:
复制import org.springframework.util.DigestUtils;import org.springframework.util.StringUtils;import java.util.UUID;public class PasswordUtil { /** * 加密(加盐处理) * @param password 待加密密码(需要加密的密码) * @return 加密后的密码 */ public static String encrypt(String password) { //随机盐值 UUID
String salt = UUID.randomUUID().toString().replaceAll("-", ""); // 密码=md5(随机盐值+密码) String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes()); return salt + "$" + finalPassword; }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.从上述代码我们可以看出,加盐的实现具体步骤是:
使用 UUID 产生一个随机盐值;将随机盐值 + 原始密码一起 MD5,产生一个新密码(相同的原始密码,每次都会生成一个不同的新密码);将随机盐值 + "$"+上一步生成的新密码加在一起 ,就是最终生成的密码。那么 ,问题来了,既然每次生成的密码都不同 ,那么怎么验证密码是否正确呢?要验证密码是否正确的关键是需要先获取盐值,然后再使用相同的加密方式和步骤,生成一个最终密码和和数据库中保存的加密密码进行对比,具体实现代码如下:
复制import org.springframework.util.DigestUtils;import org.springframework.util.StringUtils;import java.util.UUID;public class PasswordUtil { /** * 加密(加盐处理) * @param password 待加密密码(需要加密的密码) * @return 加密后的密码 */ public static String encrypt(String password) { //随机盐值 UUID
String salt = UUID.randomUUID().toString().replaceAll("-", ""); // 密码=md5(随机盐值+密码) String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes()); return salt + "$" + finalPassword; } /** * 解密 * @param password 要验证的密码(未加密) * @param securePassword 数据库中的加了盐值的密码 * @return 对比结果 true OR false */ public static boolean decrypt(String password, String securePassword) { boolean result = false; if (StringUtils.hasLength(password) && StringUtils.hasLength(securePassword)) { if (securePassword.length() == 65 && securePassword.contains("$")) { String[] securePasswordArr = securePassword.split("\\$"); //盐值
String slat = securePasswordArr[0]; String finalPassword = securePasswordArr[1]; //使用同样的加密算法和随机盐值生成最终加密的密码
password = DigestUtils.md5DigestAsHex((slat + password).getBytes()); if (finalPassword.equals(password)) { result = true; } } } return result; }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.总结
只是简单的使用 MD5 加密是不安全的 ,因为每个字符串都会生成固定的密文 ,那么我们就可以使用彩虹表将密文还原出来 ,所以它不是安全的。想要解决这个问题,我们需要通过加盐的手段 ,每次生成一个不同的密码,就把这个问题解决了 。
Tags:
转载:欢迎各位朋友分享到网络,但转载请说明文章出处“信息技术视野”。http://www.bziz.cn/news/56f899935.html
相关文章
企业安全态势的七大常见漏洞
网络安全网络安全是一场跌宕起伏,永无止境的拉锯战。攻击者的技术和手法不断花样翻新,主打一个“避实就虚”和“出奇制胜”;防御者的策略则强调“求之于势,不责于人”,依靠整体安全态势和风险策略的成熟度和韧性来化解风 ...
【网络安全】
阅读更多戴尔自动机器学习解决方案 有效降低数据科学门槛推动业务成果转化
网络安全被《哈佛商业评论》誉为21世纪最性感的职业Glassdoor 2022年美国职业榜上排名第三以“高大上、高工资、高技能”为主要标签打工人做梦的素材源泉这个金光闪闪的职业就是「数据科学家」数据科学家人才 ...
【网络安全】
阅读更多探索索尼Z5的品质(揭秘Z5的性能表现和用户评价)
网络安全随着科技的不断进步,手机成为人们生活中不可或缺的一部分。作为一个具备高性能和出色品质的手机,索尼Z5备受关注。本文将深入探讨索尼Z5的品质如何,以及用户对它的评价。一、外观设计:完美融合时尚和实用性外 ...
【网络安全】
阅读更多
热门文章
最新文章
友情链接
- 2022年及以后的四个数据中心提示
- W7手动还原系统教程(一步步教您如何使用W7手动还原系统,保护和修复您的计算机)
- 戴尔PowerEdge服务器 可轻松满足AI深度学习和高级计算等工作负载
- 戴尔易安信加固过的机箱,保证在远程和恶劣环境下工作的可靠性,满足边缘工作负载不断增长的需求
- 尼康18-300镜头全能之选(高性能、广角长焦一镜到底,满足你的各种摄影需求)
- 新型 PumaBot 僵尸网络瞄准 Linux 物联网设备窃取 SSH 凭证并挖矿
- AMDA107300和i7的性能比较研究(谁是更好的选择?)
- 戴尔科技 VMware Tanzu 加快基础设施现代化进程满足您的业务需求
- 戴尔笔记本F2刷机教程(戴尔笔记本F2刷机方法详解,助你发挥最大潜力)
- 企业数据库险遭百亿损失,瑞数DDR全周期防护破解“暗雷”阴影 源码库香港物理机网站建设b2b信息平台亿华云企业服务器云服务器