2017-12-28 72 views
-1

私は、パスワードと塩がAndroidに鍵を返すメソッドを実装しようとしています(実際には暗号化された情報を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; 
関連する問題