SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA512”)抛出NoSuchAlgorithmException

经过一些研究和一些工作后,我终于能够对密码进行哈希密码现在有一个问题,我想我已经使用了SHA1方法,我想尝试使用SHA512因为我被告知它更好(更安全)所以以下是我的代码它有点到处都是,但我认为它是可理解的:

public class Safety { //calling some parameters for possible later changes public static final String algorithm = "PBKDF2WithHmacSHA1"; public static final int saltbytesize = 24; public static final int hashbytesize = 24; public static final int iterations = 1000; public static final int iIndex = 0; public static final int sIndex = 1; public static final int pbkIndex = 2; public static Users passwordHash(Users user) throws NoSuchAlgorithmException, InvalidKeySpecException { SecureRandom sR = new SecureRandom(); byte[] pws = new byte[saltbytesize]; sR.nextBytes(pws); byte[] pwh = pbkdf2(user.getPassword().toCharArray(), pws, iterations, hashbytesize); user.setPassword(toHex(pwh)); byte[] sas = new byte[saltbytesize]; sR.nextBytes(sas); byte[] sah = pbkdf2(user.getsA().toCharArray(), sas, iterations, hashbytesize); user.setsA(toHex(sah)); user.setUserhash(pws); user.setSahash(sas); return user; } public static boolean hashpassword(String username, String password, Users user) throws NoSuchAlgorithmException, InvalidKeySpecException { byte[] pws = user.getUserhash(); byte[] pwh = pbkdf2(password.toCharArray(), pws, iterations, hashbytesize); String searcher = toHex(pwh) + username; String searched = user.getPassword() + user.getUsername(); if (searcher.equals(searched)) { return true; } return false; } private static byte[] pbkdf2(char[] password, byte[] salt, int iterations, int bytes) throws NoSuchAlgorithmException, InvalidKeySpecException { PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, bytes * 8); SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm); return skf.generateSecret(spec).getEncoded(); } 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; else return hex; } } 

那么这是我的代码,但是,我还没有能够制作SHA512并且我已经尝试过public static final String algorithm = "PBKDF2WithHmacSHA512"但这似乎不是算法的正确字符串,因为它会抛出不这样的算法exception。

我也欢迎任何可以使代码更好的变化。

如上所述! 相关的几行代码

public static final String algorithm =“PBKDF2WithHmacSHA512”<<<<<

开箱即用是不可能的

OpenJDK实现只提供了一个PBKDF2HmacSHA1Factory.java ,其中包含了“HmacSHA1”摘要。 就我测试而言,Oracle JDK在这个意义上没有什么不同。

您需要做的是派生PBKDF2HmacSHA1Factory (来吧,它是开放的 !)并向其构造函数添加一个参数。 您可以避免创建自己的Provider的麻烦,只需按如下方式初始化和使用您的工厂:

 PBKDF_SecretKeyFactory kf = new PBKDF_SecretKeyFactory("HmacSHA512"); KeySpec ks = new PBEKeySpec(password,salt,iterations,bitlen); byte key[] = kf.engineGenerateSecret(ks).getEncoded();