首先介绍一下MD5,而项目中用的是MD5和盐值来确保密码的安全性;

1. md5简介
md5的全称是md5信息摘要算法(英文:MD5 Message-Digest Algorithm ),一种被广泛使用的密码散列函数,可以产生一个128位(16字节,1字节8位)的散列值(常见的是用32位的16进制表示,比如:0caa3b23b8da53f9e4e041d95dc8fa2c),用于确保信息传输的完整一致。

2. md5原理
md5将整个文件当做一个大文本信息,通过不可逆的字符串变换算法,产生一个唯一的MD5信息摘要。文件的md5类似于人的指纹,在世界上是独立无二的,如果任何人对文件做了任何改动,其md5的值也就是对应的“数字指纹”都会发生变化。

对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

md5与对称和非对称加密算法不同,这两种密码是防止信息被窃取,而摘要算法的目标是用于证明原文的完整性。

3. md5特性
1. 不可逆

没有系统有办法知道md5原来的文字是什么。

2. 具有高度的离散性

md5码具有高度的散列性,没有规律可循,哪怕原信息只有一点点的变化,比如多个空格,那么就会导致md5发生巨大变化,也可以说产生的md5码是不可预测的。

3. 压缩性

任意长度的数据,算出的md5值得长度都是固定的。

4. 弱碰撞性

已知原数据和其md5的值,想找到一个具有相同md5值得数据(即伪造数据)是非常困难的。

4. md5的用途
密码的加密存储,用户设置密码时,服务端只记录这个密码的MD5,而不记录密码本身,以后验证用户身份时,只需要将用户输入的密码再次做一下MD5后,与记录的MD5作一个比较即可验证其密码的合法性。
数字签名,比如发布一个程序,为了防止别人在你的程序里插入病毒或木马,你可以在发布这个程序的同时,公开这个程序文件的MD5码,这样别人只需要在任何地方下载这个程序后做一次MD5,然后跟公开的这个MD5作一个比较就知道这个程序是否被第三方修改过。
文件完整性验证,比如当下载一个文件时,服务器返回的信息中包括这个文件的md5,在本地下载完毕时进行md5,将两个md5值进行比较,如果一致则说明文件完整没有丢包现象。
文件上传,比如百度云实现的秒传,就是对比你上传的文件md5在百度服务器是否已经存在了。

MD5不安全的3个原因

1、字典表很大

在网上有很多md5解密网站(如:https://md5.cn/),就如同一个字典表。通过在数据库存储很多常用的密码,可以在很短的时间内查找任何哈希值的答案。这种数据库占用大量的磁盘空间,具有一定的成功率。在计算机安全领域,一些朋友需要用到MD5解密网站,通过这类型的网站,可以提高工作效率,大家可以去试试。

2、碰撞

安全的算法具有良好的抗冲突性,也就是说对于不同的单词,获得相同哈希值的可能性比较低,但是MD5的抗冲突性较低。

3、暴力攻击速度很快

蛮力攻击是通过尝试多种可能性来查找密码的一种方法,即可以猜测用户可能使用的东西(出生日期,孩子的名字,宠物的名字等),也可以尝试一切(从a,b, c到10个字符的特殊字符密码)。抵御暴力攻击的唯一方法可能是密码长度,如果您拥有40个字符长的随机密码(带有特殊字符),那么目前你的密码可能是安全的。

所以这里采用MD5+盐值的方法来加强密码的安全性:

首先在项目中加入hutool的依赖,我们就可以使用这个类了

  <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency>

然后创建一个util工具包来存放我们的密码工具类 PasswordUtil,

接下来,我们就可以直接使用hutool里面的IdUtil生成随机盐值,然后盐值+密码再进行MD5进行进一步的加密(因为常用$符进行分隔,这里也用$进行分割)

 public static String encrypt(String password) {// 随机盐值String salt = IdUtil.simpleUUID();// 密码(md5(随机盐值+密码))String finalPassword = SecureUtil.md5(salt + password);return salt + "$" + finalPassword;}

之后,我们需要进行“解密”,,验证一下数据库中加密的密码是否达到了我们期待的结果

/*** 解密** @param password       要验证的密码(未加密)* @param securePassword 数据库中的加了盐值的密码* @return*/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 = SecureUtil.md5(slat + password);if (finalPassword.equals(password)) {result = true;}}}

进行测试

 public static void main(String[] args) {String password = "admin";String dbPassword = PasswordUtil.encrypt(password);System.out.println("加密密码:" + dbPassword);boolean result = PasswordUtil.decrypt("123", dbPassword);System.out.println("对比结果1:" + result);boolean result2 = PasswordUtil.decrypt("123456", dbPassword);System.out.println("对比结果2:" + result2);}

这样我们就完成了这个类似单元测试的一个密码加密工作,在以后的项目中都可以进行如此设置

项目中的MD5、盐值加密相关推荐

  1. java shiro盐值加密_java中spring-shiro实现密码的MD5盐值加密

    看了网上很多教程,都提到有配置spring shiro的密码加密方式,甚至给出了自定义的Class来实现.却很少有通过配置来解决的. 密码的盐值加密方式应该是非常通用的,也可以算是基础吧.按理说spr ...

  2. shiro—MD5盐值加密

    本例为在idea下shiro集成springMVC.仅有一个认证加密方式(一个realm ) 为什么是MD5盐值加密呢?shiro用密码匹配,密码一样,就ok.如果两个用户的密码一样,则就会造成麻烦. ...

  3. Springboot + Shiro——MD5 盐值加密(配置)

    其实这里所说的盐,简单的说,就是一组安全随机数.它会在特定的时候,加入到密码中(一般来说是加密后的密码).从而使密码变得更有味道(从单一简单化到复杂化),更安全. 如何做到? 1). 在 doGetA ...

  4. Shiro(三) 身份认证源码分析与 MD5 盐值加密

    文章目录 1. 身份认证 2. 身份验证的基本流程 3. 身份验证实现 3.1 在 `login.jsp` 添加登录表单 3.2 添加表单提交的 Controller 3.3 完善 Realm 的身份 ...

  5. Spring-Security之加密操作(MD5,盐值加密)

    MD5加密算法 此处借用的是JDK内部的加密算法 public class MyPasswordEncoder implements PasswordEncoder {@Overridepublic ...

  6. 登录操作之MD5盐值加密

    在商业项目中,登录操作往往需要对密码进行加密处理,以提高账号的安全程度,实现思路如下(来自于网络): 用户注册(或修改密码)时: 1)用户提供密码(以及其他用户信息): 2)系统为用户随机生成一个Sa ...

  7. java的md5盐值加密_MD5盐值加密

    import java.security.MessageDigest; import java.util.Random; import org.apache.commons.codec.binary. ...

  8. Springboot-14 shiro整合mybati 密码可以用md5盐值加密 更加安全 授权认证登录

    导入pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  9. Shiro学习笔记-----小组开发前后端分离项目---登陆认证盐值加密

    当下我正在参与的学校前后端分离的实习项目,有了登录系统的需求,于是我在了解到Shiro是当下主流的安全框 架后,毅然决然开启了学习Shiro的旅程 首先来谈谈什么是Shiro,Apache Shiro ...

  10. MD5码加密(盐值加密)

    MD5码加密(盐值加密) ​ 主要应用于用户密码在数据库的存储,当我们需要保存用户账号密码信息用于身份验证时,如果密码直接以明码的形式保存在数据库,很容易在数据库信息泄露时造成安全隐患. ​ 所以需要 ...

最新文章

  1. Kafka配置offsets.retention.minutes和log.retention.minutes的区别
  2. linux中使用xshell远程连接
  3. [Kubernetes] 如何关联PVC到特定的PV
  4. C++描述杭电OJ 2017.字符串统计||
  5. java获取本周的开始时间和结束时间_创业板注册制开始时间/股票开户流程结束后,怎么炒股?...
  6. 或许是因为本科不是学cs的HTML5原因
  7. Java中类变量(静态变量)和实例变量区别
  8. java用scanner类_java中关于scanner类的详细介绍
  9. 旧文重发:程序员的七种武器
  10. Copy-On-Write容器之一:CopyOnWriteArrayList
  11. pandas之Series()菜鸟教程
  12. Android FrameWork浅识
  13. html中怎样把背景图片置顶,HTML5中背景图片如何设置
  14. CSDN如何开启版权声明
  15. 联想服务器安装系统鼠标失灵,ThinkPad自行安装操作系统后键盘鼠标失灵怎么办...
  16. 奇安信天擎卸载密码_【web安全】记奇安信“渗透测试”培训
  17. cad编辑节点快捷键是什么_CAD常用的快捷键命令
  18. STM8控制LCD12864液晶屏实验
  19. 什么叫SSH?原理详解,看这一篇就够了!
  20. 【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(九)

热门文章

  1. 万网绑定二级域名_万网主机怎么把二级域名绑定到子目录?
  2. 1760 - 综合练习- bombing
  3. 2005年最过耳难忘的好声音-才女肖燕《女儿香》
  4. 网络安全实验4 防火墙技术的具体应用
  5. C# 使用BitBlt进行窗口抓图的示例
  6. Binder机制详解(一)
  7. 【Arduino开源项目】LCR(电感/电容/电阻)电桥测试仪
  8. 解决DevTools failed to load source map: Could not load content for xxx
  9. 前台Autoform 选择下拉框的值进行判断(js)
  10. Android在未root手机获取应用内置的SQLite数据库到电脑上处理的方法(数据库备份与恢复-支持SDK30+)