【MD5加密】用java.security.MessageDigest(md5)对信息加密
2017-05-31 10:48
543 查看
(一)用MessageDigest类对信息加密(已经加密,但密文显示方式未处理):
md5加密核心代码:
//md5加密核心代码 MessageDigest md=MessageDigest.getInstance("MD5"); String pwd="1234"; byte[] b1=pwd.getBytes(); byte[] b2=md.digest(b1);//利用md对象把 明文b1[] 加密成密文b2[]
通过字节数组显示密文:
//至此,MD5加密已经完成,可惜它生成的密文全是字节数据,不是我们通常看的懂得字节数据,因此还要进一步处理。 //注意:用MD5加密后的所变成的字节数组是16位的 System.out.println("b.len="+b2.length); for(int i=0;i<b2.length;i++){ System.out.print(b2[i]+" ");//-127 -36 -101 -37 82 -48 77 -62 0 54 -37 -40 49 62 -48 85 }
通过字符显示密文:
//将密文字节数组转换为字符串也是看不懂的 System.out.println(); for(int i=0;i<b2.length;i++){ System.out.print((char)(b2[i])+" ");//チ ᅵ ロ ᅴ R M ᅡ }
(二)用MessageDigest类对信息加密(与前面相比,怪字符少一些,但还不是16进制):
MessageDigest md=MessageDigest.getInstance("MD5"); String pwd="1234"; byte[] b1=pwd.getBytes(); byte[] b2=md.digest(b1);
注意此处用BASE74Encoder需要导入jar包,JavaAPI中是没有的:
//注意此处用BASE74Encoder需要导入jar包,JavaAPI中是没有的 BASE64Encoder en=new BASE64Encoder(); String pwd2 =en.encode(b2); System.out.println(pwd2); //结果:gdyb21LQTcIANtvYMT7QVQ==
/* * demo2()方法的缺点: * 1、密文不是我们最习惯的16进制 * 2、所使用的类在BASE64Encoder在API中是没有的,意味该类是没有公开的, * 给我们程序员用的,因此他如果便动了,我们没办法,不稳定。 * ----不在接口中,官方是可以随便改的。 */
(三)用MessageDigest类对信息加密(我们手动写代码,把md5生成的密文转换成16进制):
@Test
public void demo3() throws NoSuchAlgorithmException{
MessageDigest md=MessageDigest.getInstance("MD5"); String pwd="1234"; byte[] b1=pwd.getBytes(); byte[] b2=md.digest(b1);//密文b2[]
/*
for(int i=0;i<b2.length;i++){
String sh=Integer.toHexString(b2[i]);
System.out.print(sh+" ");
}
输出结果:ffffff81 ffffffdc ffffff9b ffffffdb 52 ffffffd0 4d ffffffc2 0 36 ffffffdb ffffffd8 31 3e ffffffd0 55
我们看到,16个字节转换成了16个16进制数,这样总共有16*16位,密文 太长,如果转换成32位就好了。
*/
//我们字节转换为16进制
String pwd2="";
for(byte i: b2){
String s = Integer.toHexString(i & 0xff); //如果i<16则s只有一位,只有>=16的i转换成的s才是两位
if(s.length()==1){
s ="0"+s; // s ="f"+s;
}
pwd2 +=s;
}
pwd2 = pwd2.toUpperCase();
System.out.println(pwd2.length());
System.out.println(pwd2);//最后的MD5结果:81DC9BDB52D04DC20036DBD8313ED055
}
完整代码示例:
package teachDemo;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.junit.Test;
import Decoder.BASE64Encoder;
public class Md5Demo {
/**
* 加密算法类:java.security.MessageDigest
*/
@Test
public void demo1() throws NoSuchAlgorithmException{
//md5加密核心代码 MessageDigest md=MessageDigest.getInstance("MD5"); String pwd="1234"; byte[] b1=pwd.getBytes(); byte[] b2=md.digest(b1);//利用md对象把 明文b1[] 加密成密文b2[]
//至此,MD5加密已经完成,可惜它生成的密文全是字节数据,不是我们通常看的懂得字节数据,因此还要进一步处理。 //注意:用MD5加密后的所变成的字节数组是16位的 System.out.println("b.len="+b2.length); for(int i=0;i<b2.length;i++){ System.out.print(b2[i]+" ");//-127 -36 -101 -37 82 -48 77 -62 0 54 -37 -40 49 62 -48 85 }
//将密文字节数组转换为字符串也是看不懂的 System.out.println(); for(int i=0;i<b2.length;i++){ System.out.print((char)(b2[i])+" ");//チ ᅵ ロ ᅴ R M ᅡ }
}
/**
* 把md5生成的密文转换成我们习惯的方式---与前面相比,怪字符少一些,但还不是16进制
*/
@Test
public void demo2() throws NoSuchAlgorithmException{
MessageDigest md=MessageDigest.getInstance("MD5"); String pwd="1234"; byte[] b1=pwd.getBytes(); byte[] b2=md.digest(b1);
//注意此处用BASE74Encoder需要导入jar包,JavaAPI中是没有的
BASE64Encoder en=new BASE64Encoder();
String pwd2 =en.encode(b2);
System.out.println(pwd2);//结果:gdyb21LQTcIANtvYMT7QVQ==
/* * demo2()方法的缺点: * 1、密文不是我们最习惯的16进制 * 2、所使用的类在BASE64Encoder在API中是没有的,意味该类是没有公开的, * 给我们程序员用的,因此他如果便动了,我们没办法,不稳定。 * ----不在接口中,官方是可以随便改的。 */
}
/**
* 我们手动写代码,把md5生成的密文转换成16进制
* @throws NoSuchAlgorithmException
*/
@Test
public void demo3() throws NoSuchAlgorithmException{
MessageDigest md=MessageDigest.getInstance("MD5"); String pwd="1234"; byte[] b1=pwd.getBytes(); byte[] b2=md.digest(b1);//密文b2[]
/*
for(int i=0;i<b2.length;i++){
String sh=Integer.toHexString(b2[i]);
System.out.print(sh+" ");
}
输出结果:ffffff81 ffffffdc ffffff9b ffffffdb 52 ffffffd0 4d ffffffc2 0 36 ffffffdb ffffffd8 31 3e ffffffd0 55
我们看到,16个字节转换成了16个16进制数,这样总共有16*16位,密文 太长,如果转换成32位就好了。
*/
//我们字节转换为16进制
String pwd2="";
for(byte i: b2){
String s = Integer.toHexString(i & 0xff); //如果i<16则s只有一位,只有>=16的i转换成的s才是两位
if(s.length()==1){
s ="0"+s; // s ="f"+s;
}
pwd2 +=s;
}
pwd2 = pwd2.toUpperCase();
System.out.println(pwd2.length());
System.out.println(pwd2);//最后的MD5结果:81DC9BDB52D04DC20036DBD8313ED055
}
}
相关文章推荐
- java.security.MessageDigest 信息加密
- 使用java.security.MessageDigest类来实现MD5、SHA加密
- java MessageDigest加密 md5 sha
- MD5例子 使用java.security.MessageDigest
- JavaScript MD5 与 Java MessageDigest 加密后的值相同
- MD5例子 使用java.security.MessageDigest
- 加密:Java利用MessageDigest获取字符串或文件MD5详解
- java.security.MessageDigest的使用,MD5,安全密令
- JavaScript MD5 与 Java MessageDigest 加密后的值相同
- java通过java.security.MessageDigest实现MD5加密
- java.security.MessageDigest的使用,MD5加密!
- [JAVA] 生成MD5 java.security.MessageDigest BUG
- java.security.MessageDigest的使用,MD5加密!
- java通过java.security.MessageDigest实现MD5加密
- JAVA MessageDigest(MD5加密等)
- Java利用MessageDigest获取字符串或文件MD5详解
- Java利用MessageDigest获取字符串或文件MD5详解
- MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest开发出
- MD5 (Message Digest Algorithm 5 信息—摘要算法5 ) 的一些体会 .
- (学习笔记)Java Message Digest Algorithm MD5