Skip to content

Commit c0cca2b

Browse files
NIFI-15876 Switched to Java Security Interfaces for PBKDF2 (#11178)
replaced Bouncy Castle generator and digest with equivalent PBKDF2WithHmacSHA512 Secret Key Factory Signed-off-by: Lucas Ottersbach <ottersbach@apache.org>
1 parent 2fa3286 commit c0cca2b

1 file changed

Lines changed: 25 additions & 18 deletions

File tree

nifi-commons/nifi-security-crypto-key/src/main/java/org/apache/nifi/security/crypto/key/pbkdf2/Pbkdf2DerivedKeyProvider.java

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,19 @@
2020
import org.apache.nifi.security.crypto.key.DerivedKeyProvider;
2121
import org.apache.nifi.security.crypto.key.DerivedKeySpec;
2222
import org.apache.nifi.security.crypto.key.DerivedSecretKey;
23-
import org.bouncycastle.crypto.CipherParameters;
24-
import org.bouncycastle.crypto.Digest;
25-
import org.bouncycastle.crypto.digests.SHA512Digest;
26-
import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator;
27-
import org.bouncycastle.crypto.params.KeyParameter;
2823

29-
import java.nio.charset.Charset;
30-
import java.nio.charset.StandardCharsets;
24+
import java.security.NoSuchAlgorithmException;
25+
import java.security.spec.InvalidKeySpecException;
3126
import java.util.Base64;
27+
import javax.crypto.SecretKey;
28+
import javax.crypto.SecretKeyFactory;
29+
import javax.crypto.spec.PBEKeySpec;
3230

3331
/**
34-
* PBKDF2 implementation of Derived Key Provider based on Bouncy Castle components with HMAC SHA-512 pseudorandom function
32+
* PBKDF2 implementation of Derived Key Provider with HMAC SHA-512 pseudorandom function
3533
*/
3634
public class Pbkdf2DerivedKeyProvider implements DerivedKeyProvider<Pbkdf2DerivedKeyParameterSpec> {
37-
private static final Charset PASSWORD_CHARACTER_SET = StandardCharsets.UTF_8;
35+
private static final String ALGORITHM = "PBKDF2WithHmacSHA512";
3836

3937
private static final int BITS = 8;
4038

@@ -54,18 +52,27 @@ public DerivedKey getDerivedKey(final DerivedKeySpec<Pbkdf2DerivedKeyParameterSp
5452
}
5553

5654
private byte[] getDerivedKeyBytes(final DerivedKeySpec<Pbkdf2DerivedKeyParameterSpec> derivedKeySpec) {
57-
final Digest digest = new SHA512Digest();
58-
final PKCS5S2ParametersGenerator generator = new PKCS5S2ParametersGenerator(digest);
59-
60-
final byte[] password = new String(derivedKeySpec.getPassword()).getBytes(PASSWORD_CHARACTER_SET);
6155
final Pbkdf2DerivedKeyParameterSpec parameterSpec = derivedKeySpec.getParameterSpec();
6256
final byte[] salt = parameterSpec.getSalt();
6357
final int iterations = parameterSpec.getIterations();
64-
generator.init(password, salt, iterations);
65-
6658
final int derivedKeyLengthBits = derivedKeySpec.getDerivedKeyLength() * BITS;
67-
final CipherParameters cipherParameters = generator.generateDerivedParameters(derivedKeyLengthBits);
68-
final KeyParameter keyParameter = (KeyParameter) cipherParameters;
69-
return keyParameter.getKey();
59+
60+
final PBEKeySpec keySpec = new PBEKeySpec(derivedKeySpec.getPassword(), salt, iterations, derivedKeyLengthBits);
61+
final SecretKeyFactory secretKeyFactory = getSecretKeyFactory();
62+
63+
try {
64+
final SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
65+
return secretKey.getEncoded();
66+
} catch (final InvalidKeySpecException e) {
67+
throw new IllegalStateException("PBKDF2 key generation failed", e);
68+
}
69+
}
70+
71+
private SecretKeyFactory getSecretKeyFactory() {
72+
try {
73+
return SecretKeyFactory.getInstance(ALGORITHM);
74+
} catch (final NoSuchAlgorithmException e) {
75+
throw new IllegalStateException("PBKDF2 algorithm not found", e);
76+
}
7077
}
7178
}

0 commit comments

Comments
 (0)