使用MD5/SHA-1对密码进行加密,并验证两个加密后的密码是否相同。 需要使用到 java.security 类 MessageDigest java.lang.Object
java.security.MessageDigestSpi
java.security.MessageDigest
public abstract class MessageDigest
extends
MessageDigestSpi
此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA
算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest 对象开始被初始化。该对象通过使用 update
方法处理数据。任何时候都可以调用 reset
方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest
方法之一完成哈希计算。
对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest
之后,MessageDigest 对象被重新设置成其初始状态。
1.实例化MessageDigest
MessageDigest md = MessageDigest.getInstance("MD5");
2.进行加密: 使用指定的字节更新摘要。
md.update(val.getBytes());
3.完成加密: 使用指定的 byte 数组对摘要进行最后更新,然后完成摘要计算。
byte[] m = md.digest();
4.判断两个MD5是否相同:比较两个摘要的相等性。
MessageDigest.isEqual(digesta, digestb)
import java.security.*;
/**
* 进行MD5校验
* @author Administrator
*
*/
public class MyDigest {
//保存16进制各个位数
private static final char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' };
/**
* 程序入口
* @param args
*/
public static void main(String[] args) {
MyDigest my = new MyDigest();
my.testDigest();
}
/**
* 测试加密校验
*/
public void testDigest() {
try {
String myinfo1 = "测试内容";
String myinfo2 = "测试结果";
byte[] digesta = getMD5(myinfo1);// 进行加密
System.out.println("本信息摘要是:" + byte2hex(digesta));
System.out.println("本信息摘要是:" + toHexString(digesta));
// 通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
byte[] digestb = getMD5(myinfo2);// 进行加密
// 判断摘要信息是否相同
if (MessageDigest.isEqual(digesta, digestb)) {
System.out.println("信息检查正常");
} else {
System.out.println("摘要不相同");
}
} catch (java.security.NoSuchAlgorithmException ex) {
System.out.println("非法摘要算法");
}
}
/**
* 对外的MD5/SHA-1加密算法
*
* @param val
* @return
* @throws NoSuchAlgorithmException
*/
public static byte[] getMD5(String val) throws NoSuchAlgorithmException {
// 构建算法类
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(val.getBytes());// 进行加密计算
byte[] m = md5.digest();// 加密完成,返回哈希码
return m;
}
/**
* 将byte数组转换为标准16进制MD5格式字符串
* 第一种方法
* @param b
* @return
*/
public String byte2hex(byte[] b) // 二行制转字符串
{
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
if (n < b.length - 1)
hs = hs + ":";
}
return hs.toUpperCase();
}
/**
* 转换为MD5标准格式
* 第2种方法
* @param b
* @return
*/
public static String toHexString(byte[] b) {
StringBuilder sb = new StringBuilder(b.length * 2);
for (int i = 0; i < b.length; i++) {
sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
sb.append(HEX_DIGITS[b[i] & 0x0f]);
if(i sb.append(":");
}
}
return sb.toString();
}
}
-----最后附上运行的结果

这样我们便可以直接使用JDK为我们提供的加密类与函数了!
MessageDigest不仅仅只为我们提供了"MD5"加密,还提供了"SHA-1"
创建的方法只为: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
MD5与SHA-1的区别为:MD5是16位,SHA是20位(这是两种报文摘要的算法)
|