一、哈希算法
哈希算法,可被称为摘要算法。因此,哈希算法的加密是单向的,不可用密文解密得到明文;其作用是对任意的数据输入,计算得到一个固定长度的输出摘要;目的是为了校验数据是否被篡改。
二、常见的几种哈希算法
1.MD5算法
- 通过MessageDigest类的单例模式创建其对象
- 通过对象的update()方法更新原始数据
- 通过对象的digest()方法加密,返回值为字节数组
- 可通过StringBuilder类,将其转换成十六进制的字符串
- MD5加密后的字节数组为16字节,其转换成十六进制的字符串长度为32位
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update("hello".getBytes());
byte[] resultArray = md5.digest();
StringBuilder str = new StringBuilder();
for(byte bite:resultArray1) {
str.append(String.format("%02x", bite));
}
System.out.println(str);
2.SHA-1算法
- 通过MessageDigest类的单例模式创建其对象
- 通过其对象的update()方法更新原始数据
- 通过其对象的digest()方法加密,其返回值为字节数组
- 通过StringBuilder类,将字节数组转换成字符串
- SHA-1算法加密后的字节数组为20字节,其转换成十六进制的字符串长度为40位
代码如下(示例):
String passworf = "wbjxxmy";
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(passworf.getBytes());
byte[] digestArray = digest.digest();
StringBuilder str = new StringBuilder();
for (byte bite : digest1Array) {
str.append(String.format("%02x", bite));
}
System.out.println(str);
小结
哈希算法加密中的MD5算法思路和SHA-1算法思路大同小异,两者除了对明文进行摘要加密还可以进行“加盐”;通过获取随机的数据,将此数据更新至明文中,一起加密;可在一定程度上防“彩虹表”的攻击。
3.HmacMD5算法
在Hmac算法加密时,分成密钥和加密两个部分:
- 生成密钥:
- 通过KeyGenerator类的单例模式创建其对象
- 其对象通过generateKey()方法生成Key
- 通过Key的getEncoded()方法生成密钥的字节数组
- 通过StringBuilder类,将密钥的字节数组转换成十六进行的字符串
- 加密:
1.通过Mac类的单例模式创建其对象
2.通过对象的Init()方法初始化密钥
3.通过对象的update()方法更新数据
4.通过对象的doFinal()方法加密,其返回值为加密的字节数组
5.通过StringBuilder类,将加密的字节数组转换成十六进制的字符串 - 生成的密钥为字节数为64字节,其加密后的字节数组为16字节
String passworf = "nhmyzgq";
// 1.生成密钥
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
SecretKey key = keyGen.generateKey();
byte[] keyByteArray = key.getEncoded();
// 2.加密
Mac mac = Mac.getInstance("HmacMD5");
mac.init(key);
mac.update(passworf.getBytes());
byte[] resultArray = mac.doFinal();
StringBuilder str = new StringBuilder();
for(byte bite:resultArray) {
str.append(String.format("%02x", bite));
}
System.out.println("加密的内容:"+str);
4.RipeMD160算法
此算法的加密基于BouncyCastle提供的第三方库
- 注册BouncyCastle提供的注册类对象BouncyCastleProvider
- 通过MessageDigest类的单例模式创建其对象
- 通过其对象的update()方法,更新原始数据
- 通过其对象的digest()方法,进行加密,其返回值为字节数组
- 可通过BigInteger()方法,将字节数组转换成十六进制的字符串
- 加密后字节数组为20字节,其转换成十六进制为40位
// 添加第三方库的对象
Security.addProvider(new BouncyCastleProvider());
MessageDigest digest = MessageDigest.getInstance("RipeMD160");
digest.update("helloworld".getBytes());
byte[] result = digest.digest();
String hex = new BigInteger(1, result).toString(16);
System.out.println("字符串的内容" + hex);
小结
哈希算法进行加密,都是摘要加密;加密后不可逆,也就是不可通过解密得到明文。以上就是常见的集中哈希算法