2017-12-28 80 views
-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); 
} 

}

+0

질문에서 추가 코드를 제거, 그 (통지) 오류를 찾을 수 있도록해야한다. – zaph

답변

0

코드 :

SecretKey secretKey = keyFactory.generateSecret(keySpec); 
byte[] keyBytes = secretKey.getEncoded(); 

return secretKey; 

당신은 keyBytes하지 secretKey를 반환해야합니다.

또는과

:

SecretKey result = new SecretKeySpec(keyBytes, "AES"); 
return secretKey; 

당신은 result하지 secretKey를 반환해야합니다. 이해를 단순화

 


:

KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, ITERATION_COUNT, KEY_LENGTH); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(PBKDF2_DERIVATION_ALGORITHM); 

SecretKey secretKey = keyFactory.generateSecret(keySpec); 
byte[] keyBytes = secretKey.getEncoded(); 

return keyBytes;