2012-07-24 61 views
2

試圖讓PBKDF2的Java實現Java實現,我用這個作爲我的C#版本:https://github.com/shawnmclean/SimpleCrypto.netPBKDF2,從C#

我的代碼:

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(); 
     }  
    } 

} 

我試過在計算器不同的答案:

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==

+1

你的結果是base64編碼但在程序中我沒有看到任何Base 64編碼碼 – 2012-07-24 12:42:50

+0

好,我已經添加使用鹼64編碼apache commons庫,但我仍然得到一個無效的結果。 – 2012-07-24 14:26:55

回答

2

我已經解決了我用下面的代碼問題,如果可能的援助,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); 
     } 
    } 

} 
0

我錯過這一點....

在程序所需的密鑰長度爲64個,但結果的密鑰長度Y OU期待是512變化期望在pbekeyspec密鑰長度爲512

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