Java使用MD5算法加密, 支持加盐
程序员文章站
2024-01-16 10:00:52
...
摘要
今天博主也开始更新博客了,为国家做贡献十几天后,第一天上班还下大雨真刺激!今天简单的讲一讲–Java使用MD5算法加密, 支持加盐。
为什么要使用MD5算法加密并加盐?
盐被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,散列值也是不同的。
MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
扩展资料:
MD5相对MD4所作的改进:
- 增加了第四轮。
- 每一步均有唯一的加法常数。
- 减弱第二轮中函数的对称性。
- 第一步加上了上一步的结果,这将引起更快的雪崩效应(就是对明文或者**改变 1bit 都会引起密文的巨大不同)。
- 改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似。
- 近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应,各轮的位移量互不相同。
代码如下
很简单的一个版本大家可以凭借经验,查阅并完善。
package com.cyj.admincenter.utils;
import java.security.MessageDigest;
/**
* @Description: 使用MD5算法加密, 支持加盐
* @BelongsProject: Family
* @BelongsPackage: com.cyj.admincenter.utils
* @Author: ChenYongJia
* @CreateTime: 2020-02-11 09:46
* @Email: aaa@qq.com
* @Version: 1.0
*/
public class PasswordEncoder {
// 十六进制数字
private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
private Object salt;
private String algorithm;
public PasswordEncoder(Object salt, String algorithm) {
this.salt = salt;
this.algorithm = algorithm;
}
/**
* 转换字节数组为16进制字串
*
* @param b 字节数组
* @return 16进制字串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
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];
}
public String encode(String rawPass) {
String result = null;
try {
MessageDigest md = MessageDigest.getInstance(algorithm);
// 加密后的字符串
result = byteArrayToHexString(md.digest(mergePasswordAndSalt(
rawPass).getBytes("utf-8")));
} catch (Exception ex) {
}
return result;
}
public boolean isPasswordValid(String encPass, String rawPass) {
String pass1 = "" + encPass;
String pass2 = encode(rawPass);
return pass1.equals(pass2);
}
private String mergePasswordAndSalt(String password) {
if (password == null) {
password = "";
}
if ((salt == null) || "".equals(salt)) {
return password;
} else {
return password + "{" + salt.toString() + "}";
}
}
public static void main(String[] args) {
// 盐值自己定
String salt = "helloworld";
PasswordEncoder encoderMd5 = new PasswordEncoder(salt, "MD5");
String encode = encoderMd5.encode("test");
// 带盐值的MD5加密
System.out.println("带盐值的MD5加密" + encode);
// 空盐值的MD5加密
System.out.println("空盐值的MD5加密"
+ new PasswordEncoder(null, "MD5").encode("test"));
boolean passwordValid = encoderMd5.isPasswordValid(
"1bd98ed329aebc7b2f89424b5a38926e", "test");
System.out.println(passwordValid);
PasswordEncoder encoderSha = new PasswordEncoder(salt, "SHA");
String pass2 = encoderSha.encode("test");
System.out.println(pass2);
boolean passwordValid2 = encoderSha.isPasswordValid(
"1bd98ed329aebc7b2f89424b5a38926e", "test");
System.out.println(passwordValid2);
}
}
结果如下:
最后
-
更多参考精彩博文请看这里:《陈永佳的博客》
-
喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!