-1
나는 암호와 소금이 안드로이드에서 키를 반환하는 방법을 구현하려고합니다. (실제로 암호화 된 정보를 DB에 저장하려고합니다.) 나는 인터넷에서 뭔가를 복사 :PBKDF2 같은 소금과 패스워드, 다른 키
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가 있습니다.
오케이 그래서 실제로 작동하는 코드의 "원본"스 니펫을 찾을 수있었습니다 (원래의 질문과 정확히 동일한 입력으로 테스트했습니다). 힌트가 있습니까?
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);
}
}
질문에서 추가 코드를 제거, 그 (통지) 오류를 찾을 수 있도록해야한다. – zaph