1.生成盐值
public static String getSalt() throws NoSuchAlgorithmException { // Use a SecureRandom generator, SHA1PRNG算法是基于SHA-1实现且保密性较强的随机数生成器 SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); // Create array for salt byte[] salt = new byte[16]; // Get a random salt secureRandom.nextBytes(salt); // 将十进制数转换成十六进制(使用&运算,正数部分没变,负数部分二进制从右往左第9位及以上都为0 StringBuilder builder = new StringBuilder(); for (byte num : salt) { builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1)); } return builder.toString(); }
2.最简单的MD5(唾弃,了解一下即可)
public static String getSimpleMD5Code(String password) { try { // Create MessageDigest instance for MD5 MessageDigest md5 = MessageDigest.getInstance("MD5"); // digest(byte[] input)使用指定的byte数组对摘要进行最后更新,然后完成摘要计算,此方法首先调用 // update(input),向update方法传递input数组,然后调用digest()。 byte[] bytes = md5.digest(password.getBytes()); // 如有中文,须添加字符集 StringBuilder builder = new StringBuilder(); for (byte num : bytes) { builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1)); } return builder.toString(); } catch (NoSuchAlgorithmException e) { System.out.println("algorithm wrong"); return null; } }
3.MD5+盐值(安全要求较低可以用)
public static String getMD5WithSaltCode(String password, String salt) { try { // Create MessageDigest instance for MD5 MessageDigest md5 = MessageDigest.getInstance("MD5"); // Get password mix salt,可以做多种组合,增加原始密码长度、复杂度 password = salt + password + salt; // digest(byte[] input)使用指定的byte数组对摘要进行最后更新,然后完成摘要计算,此方法首先调用 // update(input),向update方法传递input数组,然后调用digest()。 byte[] bytes = md5.digest(password.getBytes()); // 如有中文,须添加字符集 StringBuilder builder = new StringBuilder(); for (byte num : bytes) { builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1)); } return builder.toString(); } catch (NoSuchAlgorithmException e) { System.out.println("algorithm wrong"); return null; } }
4.使用SHA家族(中级安全,比MD家族强)
public static String getSHACode(String password, String salt, String algorithm) { // algorithm加密算法可选SHA-1/SHA-256/SHA-384/SHA-512 try { MessageDigest md = MessageDigest.getInstance(algorithm); // Get password mix salt,可以做多种组合,增加原始密码长度、复杂度 password = salt + password + salt; // digest(byte[] input)使用指定的byte数组对摘要进行最后更新,然后完成摘要计算,此方法首先调用 // update(input),向update方法传递input数组,然后调用digest()。 byte[] bytes = md.digest(password.getBytes()); // 如有中文,须添加字符集 StringBuilder builder = new StringBuilder(); for (byte num : bytes) { builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1)); } return builder.toString(); } catch (NoSuchAlgorithmException e) { System.out.println("algorithm wrong"); return null; } }
5.PBKDF2,安全性较高,比上述的强
public static String getPBKDF2Code(String password, String salt) { // 迭代次数,可依情况修改 int interNum = 10000; PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(), interNum, 128 * 4);//128位16进制字符 // PBKDF2算法应用很广泛,大多数数据库支持该算法,可用于到处密钥,也可用于口令保存 try { // SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 使用PBKDF2WithHmacSHA1 SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); byte[] bytes = secretKeyFactory.generateSecret(spec).getEncoded(); StringBuilder builder = new StringBuilder(); for (byte num : bytes) { builder.append(Integer.toString((num & 0xff) + 0x100, 16).substring(1)); } return builder.toString(); } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { System.out.println("algorithm wrong"); return null; } }
原文:https://www.cnblogs.com/hello4world/p/12122385.html