在开发中我们都会遇到密码的加密。一般的公司使用最对的就是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();elsereturn 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后端面试题(点击面试集锦菜单获取最新内容)

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




