-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);
}
}
見つける必要があります質問、(予告)エラーから余分なコードを削除してください。 – zaph