摘要算法
摘要算法,也称为哈希算法,散列算法,可以将任意一个长度的数据转化为定长的,不可逆的数字,计算结果几乎不同(几乎不用考虑重复的问题),摘要算法,主要用于对比信息源是否一致,因为信息源发生了变化,得到的摘要信息必然不同,通常用于签名校。
消息摘要算法的特点:
List item无论输入的消息有多长,计算出来的信息摘要长度总是不变的
信息摘要不是真正的随机,凡是用相同的算法,对相同的消息求两次摘要其结果必然相同
信息摘要函数是无陷门的单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复任何的信息,甚至根本找不到与源信息相关的信息。
常见的摘要算法有:MD5,SHA-1,CRC等
MD5
MD5信息摘要算法,一种广泛使用的密码散列函数,可以产生128位(16字节)的散列值,用于确保信息传输完整一致性。
加密工具类
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static String getPwd(String pwd) {
try {
// 创建加密对象
MessageDigest digest = MessageDigest.getInstance("md5");
// 调用加密对象的方法,加密的动作已经完成
byte[] bs = digest.digest(pwd.getBytes());
// 接下来,我们要对加密后的结果,进行优化,按照mysql的优化思路走
// mysql的优化思路:
// 第一步,将数据全部转换成正数:
String hexString = "";
for (byte b : bs) {
// 第一步,将数据全部转换成正数:
// 解释:为什么采用b&255
/*
* b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节)
* byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
* 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
* 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000
* 0000 0000 1001 1100 此时的temp是一个int类型的整数
*/
int temp = b & 255;
// 第二步,将所有的数据转换成16进制的形式
// 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数
// 因此,需要对temp进行判断
if (temp < 16 && temp >= 0) {
// 手动补上一个“0”
hexString = hexString + "0" + Integer.toHexString(temp);
} else {
hexString = hexString + Integer.toHexString(temp);
}
}
return hexString;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
// public static void main(String[] args) {
// String pwd = MD5Utils.getPwd("234");
// System.out.println(pwd);
// }
}
如果在字符串中后面加入一些其他的字符,就称为加盐操作
String pwd = MD5Utils.getPwd(“234”+”0x123423“);