我在 cflib.org 上使用 genAESKeyFromPW() 函数已经有一段时间了。我现在需要将其转换为直接的 Java。我已经四处询问过,但决定将其发布在这里,看看是否也能得到任何答案。
首先,看一下 genAESKeyFromPW()上cflib.org .
我创建了以下 Java 代码进行测试。
String filename = new String("foo");
String salt = new String(Base64.encodeBase64(filename.getBytes()));
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(filename.toCharArray(),salt.getBytes(), 1024,128);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
System.out.println(new String(Base64.encodeBase64(secret.getEncoded())));
Java 代码返回uJvByU+ArEvtsb+7E1mblw==
调用 genAESKeyFromPW('foo',tobase64('foo')) 返回 7ZX9TKD8WVULgTtbL/FN8w==
我知道可能存在字符编码问题。我尝试过将 UTF8 和其他格式添加到 getBytes(),但还没有找到在 CF 和 Straight Java 中返回相同值的方法。
如果有人能对此有所了解,我们将不胜感激。
最佳答案
尝试在两者中使用以下代码及其中的值:
// The password
String passwordString = "foo";
// Base64 encoded random bytes used for the SALT.
String saltString = "1234567890";
char[] passwordChars = passwordString.toCharArray();
byte[] saltBytes = Base64.decode(saltString);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(passwordChars, saltBytes, 1024, 128);
SecretKey secret = factory.generateSecret(spec);
System.out.println(Base64.encodeBytes(secret.getEncoded()));
关于java - genAESKeyFromPW() 但在 Java 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16844638/