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

相关内容

热门资讯

有谁知道[灵剑封魔录]小游戏第... 有谁知道[灵剑封魔录]小游戏第一关怎么过不是过不了关、是你不会过罢了、总共八关呢?需要找到死个水晶球...
戍边将士的故事发生在什么时候? 戍边将士的故事发生在什么时候?戍边故事多数发生在唐代。比如陈陶可怜无定河边骨,犹是春闺梦里人黄沙百战...
透明伞的伞顶裂了怎么修好? 透明伞的伞顶裂了怎么修好?最少要折掉两个伞骨的上面的伞面,这样伞面就可以翻过来,再用铁丝绑上,反过来...
模拟火车和欧洲卡车模拟2哪个比... 模拟火车和欧洲卡车模拟2哪个比较好玩呢?个人觉得欧卡好玩,现在正在玩
感恩老师的句子思 感恩老师的句子思急需!!!!加油吧!!
波西·杰克逊与神火之盗 读后感 波西·杰克逊与神火之盗 读后感你要多少字的? 另外,二楼的,电影和原著的差别大得不得了嘞,建议你看看...
从《梦回西楼》到“猪鲤”“魔法... “古色古香的舞台,舞者们每一个动作都充满了力量与美感,文化自信被表达得淋漓尽致。”——一位艺术博主的...
暑假带孩子去张家界5天4晚旅游... 暑假带孩子去张家界5天4晚旅游费用,张家界旅游5天4晚多少钱,(看完避坑) 暑假带孩子去张家界5天...
和闺蜜去张家界纯玩五日游价格,... 最近一直在盘算着和闺蜜来一场说走就走的旅行,目的地选在了风景如画的张家界。这次计划是一次纯玩五日游,...
注册北京国内旅行社相关要求与条... 在当今旅游业蓬勃发展的背景下,收购一家旅行社已成为许多投资者关注的焦点。尤其是在江西这样一个拥有丰富...
游日照必吃的美食!跟着吃就对了... 游日照必吃的美食!跟着吃就对了! 一、巧克力渔家 来日照一定不能错过巧克力渔家!!以海鲜为主打的菜单...
避暑洞穴里掀起土家文化热 新华社武汉7月17日电(记者熊翔鹤、张阳)土家吊脚楼上,一位披着红纱的新娘,坐在阁楼一边织着土家织锦...
龙商企业今石秋谷露营地再添新名... 2025年7月17日,金石滩今石秋谷露营地绿意盎然、气氛热烈。由大连黑龙江商会主办,今石秋谷露营地、...
幼儿园中班健康的油炸食品要少吃... 幼儿园中班健康的油炸食品要少吃的教案怎么写· 幼儿园中班健康活动教案《我爱洗澡》 · 中班健康教育教...
游泳有几种方式 游泳有几种方式自由泳,蛙泳,蝶泳,仰泳
姓向起什么名好听 姓向起什么名好听向鸿煊(鸿:大也煊:光明)再为大家介绍三种悦耳动听的女孩取名方法。一、用形容美女或赞...
腾讯课堂如何一边吃鸡一边听课? 腾讯课堂如何一边吃鸡一边听课?如果你有两只手机那你就可以大胆地一边吃鸡一边听课,或者你可以在电脑端登...
徐鹤宁真的是亚洲销售女神吗?我... 徐鹤宁真的是亚洲销售女神吗?我怎么没有听说过?卖课吧,我是我们村卖茶叶最多的呢,世界上卖这种茶叶,我...