2020import org .apache .nifi .security .crypto .key .DerivedKeyProvider ;
2121import org .apache .nifi .security .crypto .key .DerivedKeySpec ;
2222import 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 ;
3126import 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 */
3634public 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