【问题标题】:PBKDF2, Java Implementation from C#PBKDF2,来自 C# 的 Java 实现
【发布时间】:2012-07-22 18:36:47
【问题描述】:

试图获得一个 PBKDF2 的 java 实现,我用它作为我的 C# 版本:https://github.com/shawnmclean/SimpleCrypto.net

我的代码:

import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class PBKDF2 {

    public static void main(String[] args) {
        try {
            SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            KeySpec ks = new PBEKeySpec("iamtwentycharacterss".toCharArray(),"50.eGIYr3ZpxpWw67utH17s/A==".getBytes(),50,64);
            SecretKey s = f.generateSecret(ks);
            Key k = new SecretKeySpec(s.getEncoded(),"HmacSHA1");
            System.out.println(new String(k.getEncoded()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }       
    }

}

我在 stackoverflow 上尝试了各种答案:

Java SimpleCrypto Class for encryption / decryption producing different results in Coldfusion 9 and Java (Android)

Java - PBKDF2 with HMACSHA256 as the PRF

Password Verification with PBKDF2 in Java

不幸的是结果不匹配,结果应该是: mOs/Mw7ZRM99i/BTJ+xnmj5Pm6QlqP1vuPqrf/Qa3WwassxI1QJ447OqdoBzunbJjvrx7+bHAO1Dnj8ltS4TKA==

【问题讨论】:

  • 您的结果是 base64 编码的,但在您的程序中我没有看到任何 base 64 编码代码
  • 好的,我已经使用 apache commons 库添加了 base 64 编码,但我仍然得到一个无效的结果。

标签: java security encryption pbkdf2


【解决方案1】:

如果可能有帮助,我已经使用以下代码解决了我的问题,Rfc2898DeriveBytes 类:http://pastebin.com/iReZJ3Vq

import java.nio.charset.Charset;

import org.bouncycastle.util.encoders.Base64;

public class PBKDF2 {

    public static void main(String[] args) {
        try {
            String password = "iamtwentycharacterss";
            String salt = "50.eGIYr3ZpxpWw67utH17s/A==";
            int iterations = Integer.parseInt(salt.substring(0, salt.indexOf('.')));
            byte[] saltBytes = salt.getBytes(Charset.forName("UTF-8"));

            Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, saltBytes, iterations);
            byte[] key = rfc2898.getBytes(64);
            String hash = new String(Base64.encode(key));
            System.out.println(hash);
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex);
        }
    }

}

【讨论】:

    【解决方案2】:

    我怎么错过了这一点......

    程序中所需的密钥长度为 64,但您期望的结果密钥长度为 512。将 pbekeyspec 中所需的密钥长度更改为 512

    KeySpec ks = new PBEKeySpec("iamtwentycharacterss".toCharArray(),"50.eGIYr3ZpxpWw67utH17s/A==".getBytes(),50,512);
    

    【讨论】:

      猜你喜欢
      • 2011-05-29
      • 2014-04-30
      • 2010-11-06
      • 2016-05-24
      • 2018-07-25
      • 2014-09-23
      • 2018-11-05
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多