java中MD5加密
admin
2024-04-13 13:41:27
0

MD5加密

MD5加密是一种常见的加密方式,我们经常用在保存用户密码和关键信息上。那么它到底有什么,又什么好处呢,会被这么广泛的运用在应用开发中。

什么是MD5

MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进行摘要采集,再通过一定的位运算,最终获取加密后的MD5字符串。
  例如我们要加密一篇文章,那么我们会随机从每段话或者每行中获取一个字,把这些字统计出来后,再通过一定的运算获得一个固定长度的MD5加密后信息。因此,其很难被逆向破解。

MD5有哪些特点

  1. 针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常32位的16进制字符串);
  2. 其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解开。
  3. 运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解。
  4. 对于一个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果。

java中实现MD5加密方式

1. 使用JDK自带的API实现

加单实现如下

 
@Test
void test1() {
String pwd = "123456";
try {
MessageDigest md = MessageDigest.getInstance("MD5");// 生成一个MD5加密计算摘要
md.update(pwd.getBytes());// 计算md5函数
/**
* digest()最后确定返回md5 hash值,返回值为8位字符串。
* 因为md5 hash值是16位的hex值,实际上就是8位的字符
* BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
* 一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
*/
String hashedPwd = new BigInteger(1, md.digest()).toString(16);// 16是表示转换为16进制数
System.out.println(hashedPwd);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}

结果:

 
e10adc3949ba59abbe56e057f20f883e

2. 使用Spring的DigestUtils工具类

 
@Test
void testMD5() {
String pwd = "123456";
// 基于spring框架中的DigestUtils工具类进行密码加密
String hashedPwd1 = DigestUtils.md5DigestAsHex((pwd).getBytes());
System.out.println(hashedPwd1);
}

结果:

 
e10adc3949ba59abbe56e057f20f883e

改进- 加盐

一般加密算法固定,很容易破解,安全系数低,有很多网站可以直接破解密文。为了提高安全性,可以采取加盐的方式。生成一组随机串,保存在数据库中,然后混杂在原来的密码中,再通过加密算法加密,存进数据库中

@Test
void testMD5() {
String pwd = "123456";
String salt = UUID.randomUUID().toString();
// 基于spring框架中的DigestUtils工具类进行密码加密
String hashedPwd1 = DigestUtils.md5DigestAsHex((pwd + salt).getBytes());
System.out.println(hashedPwd1);
}

结果:

ce504625e463008803c1b875a0bd87a3

改进-加次数

多加密几次也可增加破解的难度, 一般可用于交易码等

@Test
void testMD5() {
String pwd = "123456";
String salt = UUID.randomUUID().toString();
// 基于spring框架中的DigestUtils工具类进行密码加密
String hashedPwd1 = DigestUtils.md5DigestAsHex((pwd + salt).getBytes());
hashedPwd1 = DigestUtils.md5DigestAsHex((hashedPwd1 + salt).getBytes()); // +1次
hashedPwd1 = DigestUtils.md5DigestAsHex((hashedPwd1 + salt).getBytes()); // +2次
// ... 可使用循环等
System.out.println(hashedPwd1);
}

结果:

22cca33f84e7c72132dbff6fcfc60934

3. 使用Shiro的simpleHash进行加密

当然, 我们也可以加盐加次数等

如下代码

@Test
void testShiroMD5() {
String pwd = "123456"; // 密码
String salt = UUID.randomUUID().toString(); // 盐
/**
* 参数1: 加密方式
* 参数2: 要加密的字符串
* 参数3: 盐
* 参数4: 加密次数
*/
SimpleHash sh = new SimpleHash("MD5", pwd, salt, 5); // 定义simpleHash对象
String hashedPwd = sh.toHex(); // 生成16进制密文
System.out.println(hashedPwd); // 输出
}

结果

b37e9129e9a6c1cecc8d34c60315fd8d

相关内容

热门资讯

一个人去广东玩四天多少钱?去潮... 宝子们,潮汕宛如一颗镶嵌在广东东部沿海的璀璨明珠,散发着独特而迷人的魅力。它由潮州、汕头、揭阳三座城...
旅游景区如何看待第三方营销公司... 大家好,我是张鹏远。 沸沸扬扬的罗永浩和西贝,让我吃了几天瓜,比较精彩的是,晚上无意刷抖音看到了老罗...
去广东自助四日游路线,潮汕私人... 家人们,要是你计划带娃出游,那潮汕绝对是个宝藏目的地!潮汕地区位于广东省东部沿海,由汕头、潮州、揭阳...
呼伦贝尔大草原,夏日绿海,骑马... 一、启程:久违的草原梦 “爸,你真的要带我去内蒙古?”我盯着父亲发来的消息,几乎不敢相信自己的眼睛。...
四川成都旅游六天要花多少钱?费... 旅游,是一场心灵的出走,是对单调生活的一次越狱。在众多旅游目的地中,四川一直以其独特的魅力吸引着无数...
原创 【... 本期内容 在上一期的内容里我们给大家介绍过马德拉群岛的情况,今天我们要给大家介绍的,是葡萄牙唯二海岛...
四川旅游3天2晚大全景点排名,... 宝子们,和心爱的TA一起去旅行,那可是增进感情的绝佳方式!而四川,绝对是情侣出游的梦幻之地。四川,这...
山西旅游要想不累,这样的行程令... 说完长治域内,再说说高平、晋城。 高平市距离长治市自驾或驾车距离大约为60公里,时间大约70分钟。长...
新免签政策落地三亚入境游迎契机... 极目新闻记者 丁伟 9月15日开始,中国对持普通护照的俄罗斯公民试行单方面30天免签政策,适用事由涵...
干煸手撕包菜:家常美味,酸辣下... 厨房里的手撕包菜,总能勾起我的馋虫。那酸辣开胃的滋味,仿佛能瞬间唤醒味蕾,让人忍不住多添几碗饭。 ...
清蒸多宝鱼:鲜嫩到入口即化的家... 清蒸多宝鱼 提到 “鲜”,很多人会想到清蒸鱼 —— 不经过复杂调味,仅靠蒸汽激发食材本味,让鱼肉的鲜...
原创 3... 64岁香港富商曾文豪,从暑假开始就带着妻儿到国外度假去了,期间在南法私人庄园生活了两个多月,依然意犹...
去广东怎么玩,十大热门景点,潮... 家人们,潮汕,这片藏在广东东南部沿海的宝藏之地,那可是有着说不尽的魅力。它由潮州、汕头、揭阳这三座城...
行摄华山——秋云变幻 行摄秦岭... 陶永奎 摄行摄华山——秋云变幻行摄华山——秋云变幻行摄华山——秋云变幻行摄华山——秋云变幻行摄华山—...
9月四川免票,这些冷门景点美景... 秋天来了,不带点颜色都不好意思跟人打招呼。这一次,四川直接开挂,把“仙境”搬到现实一边是瓦屋山的云海...
原创 喝... 标题:喝白酒就喝低度清香型,不伤身还能品尝甘醇美酒 在品味生活的点滴中,我们总会遇到那些令人陶醉的...