From ad03d4a47501ee8ae83dcfd821e4869f0750ef8c Mon Sep 17 00:00:00 2001 From: hamid646m Date: Mon, 4 Apr 2022 11:20:12 +0100 Subject: [PATCH] Fixed thread-safety issue of MessageDigest --- .../persistence/BasePersistenceStore.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/persistence/BasePersistenceStore.java b/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/persistence/BasePersistenceStore.java index a65b4c193..db0aaa688 100644 --- a/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/persistence/BasePersistenceStore.java +++ b/powertools-idempotency/src/main/java/software/amazon/lambda/powertools/idempotency/persistence/BasePersistenceStore.java @@ -60,7 +60,7 @@ public abstract class BasePersistenceStore implements PersistenceStore { protected boolean payloadValidationEnabled = false; private Expression validationKeyJMESPath; private boolean throwOnNoIdempotencyKey = false; - private MessageDigest hashAlgorithm; + private String hashFunctionName; /** * Initialize the base persistence layer from the configuration settings @@ -95,17 +95,7 @@ public void configure(IdempotencyConfig config, String functionName) { cache = new LRUCache<>(config.getLocalCacheMaxItems()); } expirationInSeconds = config.getExpirationInSeconds(); - - try { - hashAlgorithm = MessageDigest.getInstance(config.getHashFunction()); - } catch (NoSuchAlgorithmException e) { - LOG.warn("Error instantiating {} hash function, trying with MD5", config.getHashFunction()); - try { - hashAlgorithm = MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException ex) { - throw new RuntimeException("Unable to instantiate MD5 digest", ex); - } - } + hashFunctionName = config.getHashFunction(); configured = true; } @@ -275,10 +265,27 @@ String generateHash(JsonNode data) { } else if (data.isBoolean()) { node = data.asBoolean(); } else node = data; // anything else + + MessageDigest hashAlgorithm = getHashAlgorithm(); byte[] digest = hashAlgorithm.digest(node.toString().getBytes(StandardCharsets.UTF_8)); return String.format("%032x", new BigInteger(1, digest)); } + private MessageDigest getHashAlgorithm() { + MessageDigest hashAlgorithm; + try { + hashAlgorithm = MessageDigest.getInstance(hashFunctionName); + } catch (NoSuchAlgorithmException e) { + LOG.warn("Error instantiating {} hash function, trying with MD5", hashFunctionName); + try { + hashAlgorithm = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException("Unable to instantiate MD5 digest", ex); + } + } + return hashAlgorithm; + } + /** * Validate that the hashed payload matches data provided and stored data record *