簡體   English   中英

Java AES - 密鑰的消息摘要

[英]Java AES - message digest for the key

我最近搜索了用 AES 加密數據的 Java 代碼,並在網上找到了這段代碼:

        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        digest.update(getSecretKey().getBytes("UTF-8"));
        byte[] keyBytes = new byte[16];
        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
        Key aesKey = new SecretKeySpec(keyBytes, "AES");

        // Then encrypt
        byte[] iv = initIV();
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv));
        byte[] encrypted = cipher.doFinal(value.getBytes(encoding));

我想了解為什么開發人員使用帶有密鑰的 MessageDigest。 這種方法有什么好處,而不是寫:

        Key aesKey = new SecretKeySpec(getSecretKey().getBytes("UTF-8"), "AES");

        // Then encrypt
        byte[] iv = initIV();
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey, new IvParameterSpec(iv));
        byte[] encrypted = cipher.doFinal(value.getBytes(encoding));

提前謝謝了

吉爾斯

通過采取的SHA-256散列getSecretKey().getBytes("UTF-8")你肯定可以得到256位AES密鑰無論字符串的長度返回的getSecretKey() 這是一個有用的屬性。 程序員本質上使用 SHA-256 作為臨時密鑰派生函數(KDF)。 但是,密碼學家精心設計的 KDF 是更好的選擇。 例如,如果getSecretKey()返回的值是密碼或類似密碼的東西,那么像PBKDF2bcryptargon2這樣的密碼散列算法將是更好的選擇。

顯着的區別在於,在上面的代碼中,應用了getSecretKey()的哈希 (SHA-256) 來構建 AES 密鑰。

在下面的代碼中, getSecretKey()被直接采用原始/應用。

...以上我認為“更安全”;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM