Java 语言实现 MD5 加密
Java 语言实现 MD5 加密
背景说明
在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式,保存到数据库中。
这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么,从而防止系统被恶意访问。
密码加密有很多种方式,比如:Base64,DSA,RSA,MD5,SHA128,SHA256,SHA512等加密方式。
本文主要讲述 MD5 加密方式。
MD5 简介
MD5 消息摘要算法(英文:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。
MD5应用
1、数据加密
利用它的单向加密性,即不可逆性,我们可以应用于数据和密码的加密。
由于MD5算法的单向性,由MD5码计算出原文几乎是不可能的。目前对于这种加密方法的破解方式是收集常用的密码形式,例如生日,身份证号,电话号码等。把这些收集到的秘密用MD5处理之后进行存储,然后与需要还原的MD5进行比对,当收集的数据达到一定的数目,用户密码被破解的可能性就会变得很大。
对于这种方法,一种加强安全性的方法就是在对用户密码进行MD5处理的时候在原密码上加一个附近值,例如原密码为“password”,处理的时候变为“passworddrowssap”,经过这样的处理之后可以有效降低密码被破解的可能性。
2、确认文件是否被篡改
每个文件都可以计算出一个特定的 MD5 值。
比如,我们上传一个文件到服务器上,可以同时计算出该文件对应的 MD5 值;
在文件下载的时候,通过再次计算该文件的 MD5 值。
如果两个MD5值相同,说明文件没有变化,否则,说明文件被修改过。
Java 语言实现 MD5 加密
通过Java编写程序,实现对任意字符串进行 MD5 加密。
1、第一版代码(初始版)
代码如下:
package com.miracle.luna.md5; import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; /**
* Created by Miracle Luna on 2019/11/18
*/
public class Md5UtilOriginal { /**
* 将数据进行 MD5 加密,并以16进制字符串格式输出
* @param data
* @return
*/
public static String md5(String data) {
try {
byte[] md5 = md5(data.getBytes("utf-8"));
return toHexString(md5);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
} /**
* 将字节数组进行 MD5 加密
* @param data
* @return
*/
public static byte[] md5(byte[] data) {
try {
MessageDigest md = MessageDigest.getInstance("md5");
return md.digest(data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new byte[]{};
} /**
* 将加密后的字节数组,转换成16进制的字符串
* @param md5
* @return
*/
private static String toHexString(byte[] md5) {
StringBuilder sb = new StringBuilder();
System.out.println("md5.length: " + md5.length);
for (byte b : md5) {
sb.append(Integer.toHexString(b & 0xff));
}
return sb.toString();
} public static void main(String[] args) {
String password = "password";
String md5HexStr = md5(password);
System.out.println("==> MD5 加密前: " + password);
System.out.println("==> MD5 加密后: " + md5HexStr);
}
}
运行结果如下:
md5.length: 16
==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99
2、第二版代码(精简版)
代码如下:
package com.miracle.luna.md5; import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; /**
* Created by Miracle Luna on 2019/11/18
*/
public class Md5UtilSimple { /**
* 将数据进行 MD5 加密,并以16进制字符串格式输出
* @param data
* @return
*/
public static String md5(String data) {
StringBuilder sb = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(data.getBytes(StandardCharsets.UTF_8)); // 将字节数据转换为十六进制
for (byte b : md5) {
sb.append(Integer.toHexString(b & 0xff));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sb.toString();
} public static void main(String[] args) {
String password = "password";
String md5HexStr = md5(password);
System.out.println("==> MD5 加密前: " + password);
System.out.println("==> MD5 加密后: " + md5HexStr);
}
}
运行结果如下:
==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99
3、第三版代码(最终优化版)
代码如下:
package com.miracle.luna.md5; // 此处需要引入 commons-codec-1.13.jar
import org.apache.commons.codec.binary.Hex; import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; /**
* Created by Miracle Luna on 2019/11/18
*/
public class Md5Util { /**
* 将数据进行 MD5 加密,并以16进制字符串格式输出
* @param data
* @return
*/
public static String md5(String data) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return Hex.encodeHexString(md.digest(data.getBytes(StandardCharsets.UTF_8)));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
} public static void main(String[] args) {
String password = "password";
String md5HexStr = md5(password);
System.out.println("==> MD5 加密前: " + password);
System.out.println("==> MD5 加密后: " + md5HexStr);
}
}
运行结果如下:
==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99
commons-codec-1.13.jar 的 pom 引用如下:
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
MD5 在线加密&解密工具
1、MD5 在线加密工具
http://www.bejson.com/enc/md5/ (不仅支持 MD5加密,还支持 Base64,SHA等)
效果如下(在“加密前”后的输入框中输入需要 MD5 加密的字符串 --> 点击“MD5加密” --> 即可在“加密后”的显示显示框中看到加密后的密文):

2、MD5 在线解密
效果如下(输入框中输入需要解密的 MD5 密文,点击解密即可解密 ):

2) https://www.cmd5.com/ (这是一款很强大的解密工具,不仅支持 MD5,还支持SHA的解密)
效果如下(在密文输入框中输入 MD5 密文,点击“解密”,即可看到 MD5 的明文):

解密种类众多,选择范围如下:

MD5 密码安全性优化
由于现在直接将密码用 MD5 算法加密存在一定的安全隐患(被暴力破解的可能性),我们可以根据实际的需要,对密码加密的过程做一些逻辑处理。
比如,如下逻辑处理:
1)password --> Base64 加密,得到加密后的密码A;
2)password --> 翻转得到drowssap --> MD5 加密,得到加密后的密码B;
3)密码A+密码B拼接 --> MD5 加密,得到加密后的密码C;
4)密码C --> 翻转操作,产生密码D,作为最终的密文密码存到数据库中。
这样可以增强密码的安全性,减少被破解的可能性。(此处具体的逻辑优化,可以根据个人喜好和实际需求,灵活定义其变换的复杂性)。
【额外补充】
当密码以 MD5 密文存入到数据库中,用户登录的时候,前端将用户输入的明文密码传输给后端。
后端程序用同样的处理逻辑对其进行 MD5 加密,用加密后的密码与数据库中该用户的密文密码比较。
如果二者相等,说明用户输入的密码正确,允许访问系统;否则,说明密码不正确,禁止访问。
另外,为了系统的安全性考虑,防止恶意暴力尝试破解密码,我们经常限制用户输入密码错误的次数。
比如,连续输入3次或者5次密码,将会自动锁定账号一段时间(根据实际场景,设置锁定时长)。
关于 Base64 加密&解密 的Java 语言实现,请参考博客:https://www.cnblogs.com/miracle-luna/p/11128734.html
希望能帮到大家,谢谢!
Java 语言实现 MD5 加密的更多相关文章
- 通过java语言实现MD5加密
通过java语言实现MD5加密public static String getMd5(String str) { try { MessageDigest md5 = MessageDigest.get ...
- Java语言编写MD5加密方法,Jmeter如何给字符串MD5加密
package md5package; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; ...
- Java 自带MD5加密 Demo
package demo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...
- Java中使用MD5加密的简单实现
import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorith ...
- java 短连接+MD5加密短链接
java 短连接+MD5加密短链接 import java.security.MessageDigest; public class ShotUrlUtil { public static void ...
- Java语言实现 Base64 加密 & 解密
Java语言实现 Base64 加密 & 解密 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. Base64 ...
- java中使用MD5加密的算法
MD5,全名Message Digest Algorithm 5,中文名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.以下是JAVA语言中使用MD5加密的工具 ...
- java中使用MD5加密技术
在项目中经常会对一些信息进行加密,现在常用的信息加密技术有:MD5.RSA.DES等,今天主要说一下,md5加密,以及如何在java代码根据自己的业务需求使用md5. MD5简介: MD5即Messa ...
- java后端制作MD5加密
由于一次业务的需要,我制作了一次密码的修改子业务. 当用户忘记密码的情况下,我需要动态的发给他一个6位的随机密码,通过即时通,短信,微信等.并同时修改数据库中的原密码为这6位的随机密码.让用户再去修改 ...
随机推荐
- Redis05——Redis高级运用(管道连接,发布订阅,布隆过滤器)
Redis高级运用 一.管道连接redis(一次发送多个命令,节省往返时间) 1.安装nc yum install nc -y 2.通过nc连接redis nc localhost 6379 3.通过 ...
- 【转载】Attention Mechanism in Deep Learning
本篇随笔为转载,原文地址:知乎,深度学习中Attention Mechanism详细介绍:原理.分类及应用.参考链接:深度学习中的注意力机制. Attention是一种用于提升基于RNN(LSTM或G ...
- 【安徽集训】Emerald
Description \(n\) 座城市在数轴上,第 \(i\) 座城市有一条连向第 \(i+1\) 座城市的单向边.每座城市有一个类型 A/B 以及一个非负整数人口,A 类城市的人觉得自己的城市比 ...
- 在macOS下启用CGO_ENABLED的交叉编译
在macOS下启用CGO_ENABLED的交叉编译 在启用CGO_ENABLED的情况下,尝试使用下面命令进行Windows平台的交叉编译: $ CGO_ENABLED= GOOS=windows G ...
- (九)zabbix监控web应用
1)web应用监控介绍 使用zabbix自带的web场景可以监控url的状态码,响应时间,url的下载速度,非常的棒 思路:定义模板-->创建应用集--->定义web场景--->定义 ...
- ubuntu16下安装MySQLdb
2016年07月20日 10:37:04 tonydandelion2014 阅读数 3354更多 分类专栏: Python 1.使用pip安装 pip install mysql-python ...
- WPF界面开发技巧大放送!DevExpress WPF格式化日期时间值
DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...
- jenkins 批量修改svn 地址
svn服务器的ip变了,jenkins里那么多任务一个个修改要疯了, 每个已经创建后的任务的svn 地址都配置在 jenkins 主目录下的jobs 里对应的任务下的config.xml 里 在job ...
- Mybatis 解决问题的记录与博客
问题:mybatis 空值映射的问题Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段 https: ...
- Badboy + JMeter性能测试(转)
1. 软件介绍 1.1 Badboy Badboy是用来录制操作过程的,它录制的结果是被jmeter做并发测试的素材使用. 下载网址:http://www.badboy.com.au/ 1.2下 ...