MD5(Message Digest Algorithm)加密算法是不对称的加密算法,因为其实不可逆的,实际上其不能算作加密算法,
因为其不可解密。其实现原理是基于Hash算法(简称散列函数)。
MD5算法具有以下特点
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易(算法简单)
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、不可逆计算反推
Md5Utils
/**
*
* MD5加密工具(是基于hash算法实现,不可逆)
*
* @author xuyi3
* @2016年7月13日 @下午3:10:54
* @Md5Utils
* @功能说明:
* @春风十里不如你
* @备注
*/
public class Md5Utils {
/** 16进制的字符数组 */
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d",
"e", "f" };
/**
*
*
* @param source
* 需要加密的原字符串
* @param encoding
* 指定编码类型
* @param uppercase
* 是否转为大写字符串
* @return
*/
public static String MD5Encode(String source, String encoding, boolean uppercase) {
String result = null;
try {
result = source;
// 获得MD5摘要对象
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// 使用指定的字节数组更新摘要信息
messageDigest.update(result.getBytes(encoding));
// messageDigest.digest()获得16位长度
result = byteArrayToHexString(messageDigest.digest());
} catch (Exception e) {
e.printStackTrace();
}
return uppercase ? result.toUpperCase() : result;
}
/**
* 转换字节数组为16进制字符串
*
* @param bytes
* 字节数组
* @return
*/
private static String byteArrayToHexString(byte[] bytes) {
StringBuilder stringBuilder = new StringBuilder();
for (byte tem : bytes) {
stringBuilder.append(byteToHexString(tem));
}
return stringBuilder.toString();
}
/**
* 转换byte到16进制
*
* @param b
* 要转换的byte
* @return 16进制对应的字符
*/
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
}
//备注:其实apache commones Codec包中有常用的一些加密算法实现
MD5加密算法是一种比较简单和高效的不可逆加密算法,是基于散列函数实现的。在应用开发过程中有很多时候为了
防止明文传输都会对传输内容进行加密,比如微信支付时传输的数据就使用MD5加密之后的字符串来做校验,当然有
些支付方式(支付宝的移动支付)会采用RSA签名方式来做防数据窜改提交。