This is an automated email from the ASF dual-hosted git repository.
thenatog pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 98ab42a NIFI-8302 Corrected FingerprintFactory to use decrypt()
method removing wrapping
98ab42a is described below
commit 98ab42aebc11a56da79c2aac849d5463dadb4ef4
Author: exceptionfactory <[email protected]>
AuthorDate: Mon Mar 8 15:52:54 2021 -0600
NIFI-8302 Corrected FingerprintFactory to use decrypt() method removing
wrapping
Signed-off-by: Nathan Gough <[email protected]>
This closes #4876.
---
.../nifi/fingerprint/FingerprintFactory.java | 4 +-
.../nifi/fingerprint/FingerprintFactoryTest.java | 79 ++++++++--------------
2 files changed, 28 insertions(+), 55 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/fingerprint/FingerprintFactory.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/fingerprint/FingerprintFactory.java
index 345a247..23d8f48 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/fingerprint/FingerprintFactory.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/fingerprint/FingerprintFactory.java
@@ -87,8 +87,6 @@ public class FingerprintFactory {
private final ExtensionManager extensionManager;
private final SensitiveValueEncoder sensitiveValueEncoder;
- private byte[] sensitivePropertyKeyBytes;
-
private static final Logger logger =
LoggerFactory.getLogger(FingerprintFactory.class);
public FingerprintFactory(final PropertyEncryptor encryptor, final
ExtensionManager extensionManager, final SensitiveValueEncoder
sensitiveValueEncoder) {
@@ -545,7 +543,7 @@ public class FingerprintFactory {
* @return a deterministic string value which represents this input but is
safe to print in a log
*/
private String getLoggableRepresentationOfSensitiveValue(String
encryptedPropertyValue) {
- final String plaintextValue =
encryptor.decrypt(encryptedPropertyValue);
+ final String plaintextValue = decrypt(encryptedPropertyValue);
return sensitiveValueEncoder.getEncoded(plaintextValue);
}
diff --git
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/fingerprint/FingerprintFactoryTest.java
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/fingerprint/FingerprintFactoryTest.java
index f68cd89..5ebcbf8 100644
---
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/fingerprint/FingerprintFactoryTest.java
+++
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/fingerprint/FingerprintFactoryTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.nifi.fingerprint;
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Hex;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.connectable.Position;
@@ -26,16 +28,12 @@ import
org.apache.nifi.controller.serialization.ScheduledStateLookup;
import org.apache.nifi.controller.serialization.StandardFlowSerializer;
import org.apache.nifi.encrypt.PropertyEncryptor;
import org.apache.nifi.encrypt.SensitiveValueEncoder;
-import org.apache.nifi.encrypt.StandardSensitiveValueEncoder;
import org.apache.nifi.groups.RemoteProcessGroup;
import org.apache.nifi.nar.ExtensionManager;
import org.apache.nifi.nar.StandardExtensionDiscoveringManager;
import org.apache.nifi.remote.RemoteGroupPort;
import org.apache.nifi.remote.protocol.SiteToSiteTransportProtocol;
-import org.apache.nifi.security.util.crypto.Argon2SecureHasher;
import org.apache.nifi.security.xml.XmlUtils;
-import org.apache.nifi.util.NiFiProperties;
-import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.Document;
@@ -44,8 +42,6 @@ import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
@@ -55,7 +51,6 @@ import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
-import java.util.Base64;
import java.util.Collections;
import java.util.Optional;
@@ -74,56 +69,44 @@ public class FingerprintFactoryTest {
private PropertyEncryptor encryptor;
private ExtensionManager extensionManager;
- private FingerprintFactory fingerprinter;
+ private FingerprintFactory fingerprintFactory;
private SensitiveValueEncoder sensitiveValueEncoder;
- private NiFiProperties niFiProperties;
-
- private static final String ORIGINAL_NIFI_PROPS_PATH =
System.getProperty(NiFiProperties.PROPERTIES_FILE_PATH);
- private static final String TEST_NIFI_PROPS_PATH =
"src/test/resources/conf/nifi.properties";
@Before
public void setup() {
- niFiProperties =
NiFiProperties.createBasicNiFiProperties(TEST_NIFI_PROPS_PATH);
encryptor = createEncryptor();
- sensitiveValueEncoder = new
StandardSensitiveValueEncoder(niFiProperties);
+ sensitiveValueEncoder = createSensitiveValueEncoder();
extensionManager = new StandardExtensionDiscoveringManager();
- fingerprinter = new FingerprintFactory(encryptor, extensionManager,
sensitiveValueEncoder);
- }
-
- @AfterClass
- public static void tearDownOnce() {
- if (ORIGINAL_NIFI_PROPS_PATH != null) {
- System.setProperty(NiFiProperties.PROPERTIES_FILE_PATH,
ORIGINAL_NIFI_PROPS_PATH);
- }
+ fingerprintFactory = new FingerprintFactory(encryptor,
extensionManager, sensitiveValueEncoder);
}
@Test
public void testSameFingerprint() throws IOException {
- final String fp1 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"),
null);
- final String fp2 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1b.xml"),
null);
+ final String fp1 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"),
null);
+ final String fp2 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1b.xml"),
null);
assertEquals(fp1, fp2);
}
@Test
public void testDifferentFingerprint() throws IOException {
- final String fp1 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"),
null);
- final String fp2 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow2.xml"),
null);
+ final String fp1 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"),
null);
+ final String fp2 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow2.xml"),
null);
assertNotEquals(fp1, fp2);
}
@Test
public void testResourceValueInFingerprint() throws IOException {
- final String fingerprint =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"),
null);
+ final String fingerprint =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow1a.xml"),
null);
assertEquals(3, StringUtils.countMatches(fingerprint, "success"));
assertTrue(fingerprint.contains("In Connection"));
}
@Test
public void
testSameFlowWithDifferentBundleShouldHaveDifferentFingerprints() throws
IOException {
- final String fp1 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-1.xml"),
null);
+ final String fp1 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-1.xml"),
null);
assertTrue(fp1.contains("org.apache.nifinifi-standard-nar1.0"));
- final String fp2 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-2.xml"),
null);
+ final String fp2 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-2.xml"),
null);
assertTrue(fp2.contains("org.apache.nifinifi-standard-nar2.0"));
assertNotEquals(fp1, fp2);
@@ -131,10 +114,10 @@ public class FingerprintFactoryTest {
@Test
public void testSameFlowAndOneHasNoBundleShouldHaveDifferentFingerprints()
throws IOException {
- final String fp1 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-1.xml"),
null);
+ final String fp1 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-1.xml"),
null);
assertTrue(fp1.contains("org.apache.nifinifi-standard-nar1.0"));
- final String fp2 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-no-bundle.xml"),
null);
+ final String fp2 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-no-bundle.xml"),
null);
assertTrue(fp2.contains("MISSING_BUNDLE"));
assertNotEquals(fp1, fp2);
@@ -142,10 +125,10 @@ public class FingerprintFactoryTest {
@Test
public void
testSameFlowAndOneHasMissingBundleShouldHaveDifferentFingerprints() throws
IOException {
- final String fp1 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-1.xml"),
null);
+ final String fp1 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-bundle-1.xml"),
null);
assertTrue(fp1.contains("org.apache.nifinifi-standard-nar1.0"));
- final String fp2 =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-missing-bundle.xml"),
null);
+ final String fp2 =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow3-with-missing-bundle.xml"),
null);
assertTrue(fp2.contains("missingmissingmissing"));
assertNotEquals(fp1, fp2);
@@ -153,7 +136,7 @@ public class FingerprintFactoryTest {
@Test
public void testConnectionWithMultipleRelationshipsSortedInFingerprint()
throws IOException {
- final String fingerprint =
fingerprinter.createFingerprint(getResourceBytes("/nifi/fingerprint/flow-connection-with-multiple-rels.xml"),
null);
+ final String fingerprint =
fingerprintFactory.createFingerprint(getResourceBytes("/nifi/fingerprint/flow-connection-with-multiple-rels.xml"),
null);
assertNotNull(fingerprint);
assertTrue(fingerprint.contains("AAABBBCCCDDD"));
}
@@ -161,7 +144,7 @@ public class FingerprintFactoryTest {
@Test
public void testSchemaValidation() throws IOException {
FingerprintFactory fp = new FingerprintFactory(null,
getValidatingDocumentBuilder(), extensionManager, null);
- final String fingerprint =
fp.createFingerprint(getResourceBytes("/nifi/fingerprint/validating-flow.xml"),
null);
+
fp.createFingerprint(getResourceBytes("/nifi/fingerprint/validating-flow.xml"),
null);
}
private byte[] getResourceBytes(final String resource) throws IOException {
@@ -220,7 +203,7 @@ public class FingerprintFactoryTest {
fingerprintFromComponent.setAccessible(true);
final StringBuilder fingerprint = new StringBuilder();
- fingerprintFromComponent.invoke(fingerprinter, fingerprint, input);
+ fingerprintFromComponent.invoke(fingerprintFactory, fingerprint,
input);
return fingerprint.toString();
}
@@ -285,19 +268,7 @@ public class FingerprintFactoryTest {
when(component.getProxyPassword()).thenReturn(proxyPassword);
when(component.getVersionedComponentId()).thenReturn(Optional.empty());
- // Build the same secure hasher to derive the HMAC key
- Argon2SecureHasher a2sh = new Argon2SecureHasher();
-
- // The nifi.properties file needs to be present
- String npsk =
niFiProperties.getProperty(NiFiProperties.SENSITIVE_PROPS_KEY);
-
- // The output will be 32B (256b)
- byte[] sensitivePropertyKeyBytes =
a2sh.hashRaw(npsk.getBytes(StandardCharsets.UTF_8));
-
- Mac mac = Mac.getInstance("HmacSHA256");
- mac.init(new SecretKeySpec(sensitivePropertyKeyBytes, "HmacSHA256"));
- byte[] hashedBytes =
mac.doFinal(proxyPassword.getBytes(StandardCharsets.UTF_8));
- final String hashedProxyPassword = "[MASKED] (" +
Base64.getEncoder().encodeToString(hashedBytes) + ")";
+ final String hashedProxyPassword =
sensitiveValueEncoder.getEncoded(proxyPassword);
// Assert fingerprints with expected one.
final String expected = "id" +
@@ -367,7 +338,7 @@ public class FingerprintFactoryTest {
final Element processGroup = document.getDocumentElement();
final StringBuilder sb = new StringBuilder();
- fingerprinter.addProcessGroupFingerprint(sb, processGroup, new
FlowEncodingVersion(1, 0));
+ fingerprintFactory.addProcessGroupFingerprint(sb, processGroup, new
FlowEncodingVersion(1, 0));
final String fingerprint = sb.toString();
final String[] criticalFingerprintValues = new String[] {
@@ -388,12 +359,16 @@ public class FingerprintFactoryTest {
return new PropertyEncryptor() {
@Override
public String encrypt(String property) {
- return property;
+ return
Hex.encodeHexString(property.getBytes(StandardCharsets.UTF_8));
}
@Override
public String decrypt(String encryptedProperty) {
- return encryptedProperty.substring(4,
encryptedProperty.length() - 1);
+ try {
+ return new String(Hex.decodeHex(encryptedProperty));
+ } catch (DecoderException e) {
+ throw new IllegalArgumentException(e);
+ }
}
};
}