使用JDK提供的MD5算法对字符串进行加密
2015-08-12 23:01
615 查看
MD5算法虽然被破解,虽然国际上已经研究出MD5算法的后继者,但是MD5算法作为古老的Hash Function 它在现实的应用中是很常见的。众所周知,MD5算法将任意字节数组转化为长度为16的字节数组,那么如何将转化出的字节数组义字符串的形式存储在数据库中呢?以下是一个简单的方式
JDK包装了MD5算法的实现,提供MessageDigest类来封装各种加密算法,并且该类的实际是单例的
首先我们可以通过MessageDigest.getInstance("MD5"),获取MD5算法的包装实例
MessageDigest messageDigest =
MessageDigest.getInstance("MD5");
然后将转化前的字符串转化为字节数组
byte [] bytes = str.getBytes();
在通过算法实例的digest()方法,来处理字节数组
byte [] targs = messageDigest .digest(bytes);//得到一个长度为16的字节数组
接下来处理字节数组转化为一个字符串,其处理的方法五花八门,怎么处理都不为过,这里介绍一个简单的方法:
一个字节byte 可由一个8位二进制表示其取值范围为-128-127
比如0 0 0 1 0 1 01 其可以由两个16进制数表示:0x15,这就是本方法的核心,将一个字节数拆分为两个16进制数,再进行拼接,设一个字节变量为b,获取其高4位数(表示为16进制):(b>>4)&0x0F—>其取值范围为0-15,但是要表示成0-F所以可以第一个字符数组
final char[] chars = new char[]'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
chars[(b>>4)&0x0F]就表示0-F的16进制数,低4位chars[b&0x0F],再用一个StringBuffer连接个字符就构成了一个32位字符串
可以将其写成一个方法就是
JDK包装了MD5算法的实现,提供MessageDigest类来封装各种加密算法,并且该类的实际是单例的
首先我们可以通过MessageDigest.getInstance("MD5"),获取MD5算法的包装实例
MessageDigest messageDigest =
MessageDigest.getInstance("MD5");
然后将转化前的字符串转化为字节数组
byte [] bytes = str.getBytes();
在通过算法实例的digest()方法,来处理字节数组
byte [] targs = messageDigest .digest(bytes);//得到一个长度为16的字节数组
接下来处理字节数组转化为一个字符串,其处理的方法五花八门,怎么处理都不为过,这里介绍一个简单的方法:
一个字节byte 可由一个8位二进制表示其取值范围为-128-127
比如0 0 0 1 0 1 01 其可以由两个16进制数表示:0x15,这就是本方法的核心,将一个字节数拆分为两个16进制数,再进行拼接,设一个字节变量为b,获取其高4位数(表示为16进制):(b>>4)&0x0F—>其取值范围为0-15,但是要表示成0-F所以可以第一个字符数组
final char[] chars = new char[]'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
chars[(b>>4)&0x0F]就表示0-F的16进制数,低4位chars[b&0x0F],再用一个StringBuffer连接个字符就构成了一个32位字符串
可以将其写成一个方法就是
String md5(String str) { try { StringBuffer buffer = new StringBuffer(); char[] chars = new char[]{'0','1','2','3', '4','5','6','7','8','9','A','B','C','D','E','F'}; byte [] bytes = str.getBytes(); MessageDigest messageDigest = MessageDigest.getInstance("MD5"); byte[] targ = messageDigest.digest(bytes); for(byte b:targ) { buffer.append(chars[(b>>4)&0x0F]); buffer.append(chars[b&0x0F]); } return buffer.toString(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
相关文章推荐
- Producible Media Types
- Java第二十天
- Java开发环境配置
- 学习笔记-- java中使用SQL语言
- 编译原理——词法分析器
- java.net.SocketTimeoutException: failed to connect to /192.168.56.1 (port 8080) after 5000ms
- 安装有Maven的Eclipse启动时出现JDK警告
- PyDev for eclipse 插件下载地址
- java编码问题
- Java中如何遍历Map对象的4种方法
- java设计模式-工厂模式学习笔记
- java设计模式-工厂模式学习笔记
- 1.A+B+C问题(Java)
- eclipse 安装 和 配置 maven 插件
- 8_12_Java数据类型转换
- Java 简繁转换 ZHConverter
- Exception in thread "main" java.lang.NoClassDefFoundError: Demo (wrong name: com/zhangyun/Demo)解决办法
- Path Patterns 和 Patterns with Placeholders
- Hbase的java api操作小结
- eclipse里面生成serialVersionUID报错