Java MD5加密原理分析及代码示例
来源:互联网 发布:xbox one游戏知乎 编辑:程序博客网 时间:2024/05/12 12:13
由于MD5的不可逆,所以有的网站会把密码转换MD5,然后存储。但是这种算法并不是100%严密的,参考MD5 - 维基百科
下面就写写MD5在Java中的使用。
主要分为四步
定义一个char数组,存储16进制的基本字符
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
其中的英语字符可以大写也可以小写,取决于你要的结果是大写还是小写。比如
123456转换后
大写是E10ADC3949BA59ABBE56E057F20F883E
小写是e10adc3949ba59abbe56e057f20f883e
获取Java中的MD5类,用于把输入的字符进行信息摘要运算,得到一个byte数组。
MessageDigest md = null;try { md = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) { e.printStackTrace();}md.reset();md.update(str.getBytes());byte[] bArray = md.digest();
这个byte数组是2进制的数据,下一步我们要把2进制转换成16进制
转换16进制,这一步是关键
protected static char[] encodeHex ( final byte[] data, final char[] toDigits){ final int len = data.length; final char[] out = new char[len << 1]; for (int i = 0, j = 0; i < len; i++) { out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]]; } return out;}
<< 和 >>> 都是java的位移操作符
在说明之前需要解释一下2进制到16进制的转换,
把data[i]的高四位(data[i]>>>4) 和0xF0做 & 运算((0xF0 & data[i]) >>> 4),得到16进制高1位
把data[i]的低四位(data[i]) 和0xF0做 & 运算,得到16进制低1位
上面两句得到的值都是0到15,这样就得到toDigits数组的位置对应的字符。
final char[] out = new char[len << 1];
这个语句表示要定义一个输出数组(out[]),长度是需要转换数组(date[])的2倍。
为什么要是2倍呢,因为2进制的128位,要对应16进制的32位,一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
最后一步就是把得到的char数组转换成字符串输出。
下面是完整代码
public static String StringMD5(String str){ char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } md.reset(); md.update(str.getBytes()); byte[] bArray = md.digest(); String finalStr = new String(encodeHex(bArray, hexDigits)); System.out.println("16位大写:" + finalStr.substring(8, 24)); System.out.println("32位大写:" + finalStr); return finalStr;}protected static char[] encodeHex ( final byte[] data, final char[] toDigits){ final int len = data.length; final char[] out = new char[len << 1]; for (int i = 0, j = 0; i < len; i++) { out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]]; } return out;}
补充几点:网上有很多Java中MD5的加密实现,和本文所提内容主要区别就是2进制转换16进制
本文是自己写的2进制转换16进制,网上的大部分是利用了java的方法直接转换的,比如
Integer.toHexString(bt)所以碰到这些也不要迷惑,只是实现不同而已。
- Java MD5加密原理分析及代码示例
- Java MD5加密原理分析及代码示例
- MD5加密示例代码
- MD5加密代码(java)
- Java MD5加密代码
- Java MD5加密代码 .
- Java MD5加密代码
- JAVA MD5 加密代码
- java Md5 加密代码!
- JAVA MD5加密代码
- md5 加密java代码
- java MD5加密代码
- MD5加密java代码
- MD5加密-java代码
- java实现md5加密示例
- java 内置base64+md5加密运用代码,及指定字符md5加密代码
- Java实现MD5加密及解密的代码实例分享
- MD5加密代码(java)
- abp及实战框架概述
- 个人网站
- Go语言学习笔记 -- 控制结构
- ScrollView嵌套RecycleView时,RecycleView滑动不流畅(无惯性)
- H5、React Native、Native应用对比分析
- Java MD5加密原理分析及代码示例
- 数据科学
- solr学习之路 摆脱solr页面客户端使用代码实现增删查改 <四>
- iOS 开发之https和http
- 海量数据分析问题总结
- C#中的 .NET 弱事件模式 / The .NET weak event pattern in C#
- 插入排序
- Linux下通过WAR包方式安装Jira 3.6.3到Tomcat6,以及破解、数据备份和恢复
- 从求逆序对和mergeSort谈起