Hey guys, I have a question about the aesEncrypt method in 
org.apache.deltaspike.core.impl.crypto.DefaultCipherService.aesEncrypt.
In this method, it uses a customized key derivation function:

private SecretKeySpec getSecretKeySpec(String password)
{
        byte[] pwdHash = secureHash(password);
        byte[] key = Arrays.copyOf(pwdHash, 16); // use only first 128 bit
        // Note: using 128 bit AES avoids requirement for "Unlimited Crypto” 
patch
        return new SecretKeySpec(key, "AES");
}

This function hashes the provided password once as the encryption key without 
using Java’s pbkdf.

protected byte[] secureHash(String value)
{
try
{
        MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
        return md.digest(value.getBytes(UTF_8));
}
catch (NoSuchAlgorithmException e)
{
        throw new RuntimeException(e);
}
}

However, such a low iteration count may not be sufficient for modern 
encryption. For example, RFC 8018 recommends at least 1000 iterations for 
PBE[1]. In 2023, OWASP recommended to use 600,000 iterations for 
PBKDF2-HMAC-SHA256 and 210,000 for PBKDF2-HMAC-SHA512[2]. 
Shall we instead use a standard PBKDF with larger iteration count here?
For example:

private SecretKeySpec getSecretKeySpec(String password)
{
        int iterationCount = 10000; // Recommended: at least 10,000 iterations
        int keyLength = 128; // using 128 bit AES
        KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 
iterationCount, keyLength);
        SecretKeyFactory factory = 
SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256”);
        byte[] key = factory.generateSecret(spec).getEncoded();
                // Note: using 128 bit AES avoids requirement for "Unlimited 
Crypto” patch
        return new SecretKeySpec(key, "AES");
}


[1] "PKCS #5: Password-Based Cryptography Specification, Version 2.0" 
<http://tools.ietf.org/html/rfc2898#section-5.2>
[2]  "Password Storage Cheat Sheet" 
<https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2>

Reply via email to