您的位置:首页 > 编程语言 > Java开发

【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
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: