我试图实现一个给出密码和salt的方法在Android中返回一个键(实际上我想用它来在DB上存储加密信息)。我从互联网上复制了一些东西:
public SecretKey deriveKeyPbkdf2(byte[] salt, String password) {
try {
long start = System.currentTimeMillis();
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt,
ITERATION_COUNT, KEY_LENGTH);
SecretKeyFactory keyFactory = null;
try {
keyFactory = SecretKeyFactory
.getInstance(PBKDF2_DERIVATION_ALGORITHM);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
SecretKey secretKey = keyFactory.generateSecret(keySpec);
byte[] keyBytes = secretKey.getEncoded();
SecretKey result = new SecretKeySpec(keyBytes, "AES");
long elapsed = System.currentTimeMillis() - start;
return secretKey;
//return secretKey;
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
事实是,如果我用相同的密码和盐调用这个方法,它就不起作用(它总是给我新的密钥,根本不匹配!)。 这有什么问题?我应该知道Android有哪些东西?
好的,所以我设法找到了#34;原作"实际工作的代码片段(我使用与原始问题完全相同的输入进行测试)...任何提示?
public static byte[] deriveKeyPbkdf2(byte[] salt, String password) {
try {
long start = System.currentTimeMillis();
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt,
ITERATION_COUNT, KEY_LENGTH);
SecretKeyFactory keyFactory = SecretKeyFactory
.getInstance(PBKDF2_DERIVATION_ALGORITHM);
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
Log.d(TAG, "key bytes: " + toHex(keyBytes));
long elapsed = System.currentTimeMillis() - start;
Log.d(TAG, String.format("PBKDF2 key derivation took %d [ms].",
elapsed));
return keyBytes;
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
答案 0 :(得分:0)
代码:
Private Sub UserForm_Initialize()
Dim i As Long
For i = 1 To 4
ListBox1.AddItem "Item A - " & i
Next i
ListBox1.ListIndex = 0
End Sub
Private Sub ListBox1_Change()
Dim i As Long
ListBox2.Clear
For i = 1 To 3
ListBox2.AddItem "Item B - " & i
Next i
ListBox2.ListIndex = 0
TextBox1.Value = ListBox1.Value
End Sub
Private Sub ListBox2_Change()
TextBox2.Value = ListBox2.Value
End Sub
您应该返回SecretKey secretKey = keyFactory.generateSecret(keySpec);
byte[] keyBytes = secretKey.getEncoded();
return secretKey;
而不是keyBytes
。
或者用:
secretKey
您应该返回SecretKey result = new SecretKeySpec(keyBytes, "AES");
return secretKey;
而不是result
。
简化以便理解:
secretKey