尝试获取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 - PBKDF2 with HMACSHA256 as the PRF
Password Verification with PBKDF2 in Java
不幸的是结果不匹配,结果应该是:
mOs/Mw7ZRM99i/BTJ+xnmj5Pm6QlqP1vuPqrf/Qa3WwassxI1QJ447OqdoBzunbJjvrx7+bHAO1Dnj8ltS4TKA==
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:0)
我多么想念这一点......
程序中所需的密钥长度为64,但结果的密钥长度为512.将pbekeyspec中的所需密钥长度更改为512
KeySpec ks = new PBEKeySpec("iamtwentycharacterss".toCharArray(),"50.eGIYr3ZpxpWw67utH17s/A==".getBytes(),50,512);