暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PBKDF2加密,抛弃MD5

笔记有云 2020-03-30
2499

    在开发中我们都会遇到密码的加密。一般的公司使用最对的就是MD5加密,但是这种加密方式不安全。今天就分享一个加密方式,那就是PBKDF2加密方式。

    其原理是将明文密码和盐值进行hash后得到的结果作为盐值继续hash,重复此过程得到的结果为最后的密文,这个过程可以达到数千次,大大增加了密码的安全性。

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.math.BigInteger;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.KeySpec;


/**
* PBKDF2加密工具类
* @author RickSun && iFillDream
*/
public class PBKDF2Util {
public static final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA1";
public static final int SALT_BYTE_SIZE = 32 / 2; //盐的长度
public static final int HASH_BIT_SIZE = 128 * 4; //生成密文的长度
public static final int PBKDF2_ITERATIONS = 1000; //迭代次数


public static void main(String[] args) {
String password = "123";
// String salt = randomSalt();
String salt = "111";
String encryped = encryped(password, salt);
System.out.println("盐值:" + salt);
System.out.println("加密后:" + encryped);
System.out.println("验证结果:" + check(password,encryped,salt));
}


/**
* PBKDF2加密
* @param password 明文密码
* @param salt 盐值
* @return
*/
public static String encryped(String password,String salt){
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), PBKDF2_ITERATIONS, HASH_BIT_SIZE);
try {
SecretKeyFactory f = SecretKeyFactory.getInstance(PBKDF2_ALGORITHM);
return toHex(f.generateSecret(spec).getEncoded());
}catch (Exception e){
e.printStackTrace();
}
return "";
}


/**
* 验证密码
* @param attemptedPassword 明文密码
* @param password 加密后的密码
* @param salt 盐值
* @return
*/
public static boolean check(String attemptedPassword,String password,String salt){
String encryped = encryped(attemptedPassword, salt);
return encryped.equals(password);
}


/**
* 二进制字符串转十六进制字符串
* @param array
* @return
*/
private static String toHex(byte[] array) {
BigInteger bi = new BigInteger(1, array);
String hex = bi.toString(16);
int paddingLength = (array.length * 2) - hex.length();
if (paddingLength > 0)
return (String.format("%0" + paddingLength + "d", 0) + hex).toUpperCase();
else
return hex.toUpperCase();
}


/**
* 生成随机盐
* @return
* @throws NoSuchAlgorithmException
*/
public static String randomSalt() {
SecureRandom random = null;
try {
random = SecureRandom.getInstance("SHA1PRNG");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] salt = new byte[SALT_BYTE_SIZE];
random.nextBytes(salt);
return toHex(salt);
}


}

【精彩推荐】

Java排序算法

Java毕业论文

Java后端面试题(点击面试集锦菜单获取最新内容)

文章转载自笔记有云,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论