简体   繁体   English

SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA512”)抛出NoSuchAlgorithmException

[英]SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA512”) throws NoSuchAlgorithmException

After a little bit of research and some work I finally was able to hash salt the password now there is a question which is on my mind I have used the SHA1 method and I would like to try to use the SHA512 because I was told it's better (more secure) so the following is my code its a little bit all over the place but I think its comprehensible so: 经过一些研究和一些工作,我终于能够哈希密码了,现在有一个问题在我的脑海里,我已经使用了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;
   }
}

So that's my code, however, I have not been able to make that SHA512 and I have already tried public static final String algorithm = "PBKDF2WithHmacSHA512" but that doesn't seem to be the right string for the algorithm since it throws the no such algorithm exception. 那么这是我的代码,但是,我还没有能够制作SHA512并且我已经尝试过public static final String algorithm = "PBKDF2WithHmacSHA512"但这似乎不是算法的正确字符串,因为它会抛出不这样的算法异常。

I also welcome any changes that would make the code better. 我也欢迎任何可以使代码更好的更改。

as stated above! 如上所述! relevant few line(s) of code 相关的几行代码

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

That is not possible out of the box 开箱即用是不可能的

The OpenJDK implementation does only provide a PBKDF2HmacSHA1Factory.java which has the "HmacSHA1" digest harcoded. OpenJDK实现只提供了一个PBKDF2HmacSHA1Factory.java ,其中包含了“HmacSHA1”摘要。 As far as I tested, the Oracle JDK is not different in that sense. 就我测试而言,Oracle JDK在这个意义上并没有什么不同。

What you have to do is derive the PBKDF2HmacSHA1Factory (come on, it is open !) and add a parameter to its constructor. 你需要做的是派生PBKDF2HmacSHA1Factory (来吧,它是开放的 !)并在其构造函数中添加一个参数。 You may avoid the mess of creating your own Provider , and just initialize and use your factory as follows: 您可以避免创建自己的Provider的麻烦,只需按如下方式初始化和使用您的工厂:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 PBKDF2WithHmacSHA512 SecretKeyFactory 不可用 - PBKDF2WithHmacSHA512 SecretKeyFactory not available PBKDF2WithHmacSHA512 抛出 NoSuchAlgorithmException - PBKDF2WithHmacSHA512 throwing NoSuchAlgorithmException PBKDF2WithHmacSHA512 对比。 PBKDF2WithHmacSHA1 - PBKDF2WithHmacSHA512 Vs. PBKDF2WithHmacSHA1 用于 AES 加密的 PHP 中的 PBKDF2WithHmacSHA512 Java 等效项 - PBKDF2WithHmacSHA512 Java equivalent in PHP for AES encryption SecretKeyFactory.getInstance()在单元测试中抛出所有算法的异常 - SecretKeyFactory.getInstance() throws exception for all algorithms in unit tests 使用PBKDF2WithHmacSHA512进行密码保护在生产设置(AWS)上花费了大量处理时间 - password protection using PBKDF2WithHmacSHA512 is taking lot of processing time on production setup(AWS) 来自“PBKDF2WithHmacSHA512”的java散列与python CRYPT(digest_alg =&#39;pbkdf2(1000,20,sha512)&#39;,salt = True)(密码)[0]不同 - java hash from “PBKDF2WithHmacSHA512” is differs from python CRYPT(digest_alg='pbkdf2(1000,20,sha512)', salt=True)(password)[0]) 如何用文件源替换SecretKeyFactory.getInstance(“ Some String”) - How to replace the SecretKeyFactory.getInstance(“Some String”) with a file source 使用SecretKeyFactory的NoSuchAlgorithmException - NoSuchAlgorithmException with SecretKeyFactory java.security.NoSuchAlgorithmException:算法PBKDF2WithHmacSHA1不可用 - java.security.NoSuchAlgorithmException: Algorithm PBKDF2WithHmacSHA1 not available
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM