PBKDF2相同的盐和密码,不同的键

时间:2017-12-28 16:17:00

标签: android security encryption pbkdf2

我试图实现一个给出密码和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);
}

}

1 个答案:

答案 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