diff --git a/core-java-security/pom.xml b/core-java-security/pom.xml
index cf91121465..7c4ab9763f 100644
--- a/core-java-security/pom.xml
+++ b/core-java-security/pom.xml
@@ -44,8 +44,8 @@
3.8.1
- 1.55
- 1.10
+ 1.60
+ 1.11
3.10.0
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java b/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java
new file mode 100644
index 0000000000..94dd22ff4b
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/DigestAlgorithms.java
@@ -0,0 +1,9 @@
+package com.baeldung.hashing;
+
+public class DigestAlgorithms {
+
+ public static final String SHA3_256 = "SHA3-256";
+ public static final String SHA_256 = "SHA-256";
+ public static final String KECCAK_256 = "Keccak-256";
+
+}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java
new file mode 100644
index 0000000000..19fc4cf059
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/Keccak256Hashing.java
@@ -0,0 +1,30 @@
+package com.baeldung.hashing;
+
+import org.bouncycastle.jcajce.provider.digest.Keccak;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+
+import static com.baeldung.hashing.DigestAlgorithms.KECCAK_256;
+import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
+
+public class Keccak256Hashing {
+
+ public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
+ Security.addProvider(new BouncyCastleProvider());
+ final MessageDigest digest = MessageDigest.getInstance(KECCAK_256);
+ final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return bytesToHex(encodedhash);
+ }
+
+ public static String hashWithBouncyCastle(final String originalString) {
+ Keccak.Digest256 digest256 = new Keccak.Digest256();
+ byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return new String(Hex.encode(hashbytes));
+ }
+
+}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java
index 4fa164cadc..ec008cebab 100644
--- a/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java
+++ b/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java
@@ -8,15 +8,18 @@ import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import static com.baeldung.hashing.DigestAlgorithms.SHA_256;
+import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
+
public class SHA256Hashing {
public static String HashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
- final MessageDigest digest = MessageDigest.getInstance("SHA-256");
+ final MessageDigest digest = MessageDigest.getInstance(SHA_256);
final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
return bytesToHex(encodedhash);
}
- public static String HashWithGuava(final String originalString) {
+ public static String hashWithGuava(final String originalString) {
final String sha256hex = Hashing.sha256().hashString(originalString, StandardCharsets.UTF_8).toString();
return sha256hex;
}
@@ -27,20 +30,10 @@ public class SHA256Hashing {
}
public static String HashWithBouncyCastle(final String originalString) throws NoSuchAlgorithmException {
- final MessageDigest digest = MessageDigest.getInstance("SHA-256");
+ final MessageDigest digest = MessageDigest.getInstance(SHA_256);
final byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
final String sha256hex = new String(Hex.encode(hash));
return sha256hex;
}
- private static String bytesToHex(byte[] hash) {
- StringBuffer hexString = new StringBuffer();
- for (int i = 0; i < hash.length; i++) {
- String hex = Integer.toHexString(0xff & hash[i]);
- if (hex.length() == 1)
- hexString.append('0');
- hexString.append(hex);
- }
- return hexString.toString();
- }
}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java
new file mode 100644
index 0000000000..eb363205b1
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/SHA3Hashing.java
@@ -0,0 +1,45 @@
+package com.baeldung.hashing;
+
+import com.google.common.hash.Hashing;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.bouncycastle.crypto.digests.SHA3Digest;
+import org.bouncycastle.jcajce.provider.digest.SHA3;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.util.encoders.Hex;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+
+import static com.baeldung.hashing.DigestAlgorithms.SHA3_256;
+import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
+
+public class SHA3Hashing {
+
+ /* works with JDK9+ only */
+ public static String hashWithJavaMessageDigestJDK9(final String originalString) throws NoSuchAlgorithmException {
+ final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
+ final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return bytesToHex(hashbytes);
+ }
+
+ public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
+ Security.addProvider(new BouncyCastleProvider());
+ final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
+ final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return bytesToHex(hashbytes);
+ }
+
+ /* works with JDK9+ only */
+ public static String hashWithApacheCommonsJDK9(final String originalString) {
+ return new DigestUtils(SHA3_256).digestAsHex(originalString);
+ }
+
+ public static String hashWithBouncyCastle(final String originalString) {
+ SHA3.Digest256 digest256 = new SHA3.Digest256();
+ byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8));
+ return new String(Hex.encode(hashbytes));
+ }
+
+}
diff --git a/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java b/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java
new file mode 100644
index 0000000000..0f28408083
--- /dev/null
+++ b/core-java-security/src/main/java/com/baeldung/hashing/SHACommonUtils.java
@@ -0,0 +1,16 @@
+package com.baeldung.hashing;
+
+class SHACommonUtils {
+
+ public static String bytesToHex(byte[] hash) {
+ StringBuffer hexString = new StringBuffer();
+ for (byte h : hash) {
+ String hex = Integer.toHexString(0xff & h);
+ if (hex.length() == 1)
+ hexString.append('0');
+ hexString.append(hex);
+ }
+ return hexString.toString();
+ }
+
+}
diff --git a/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java
new file mode 100644
index 0000000000..9ed35c8834
--- /dev/null
+++ b/core-java-security/src/test/java/com/baeldung/hashing/Keccak256HashingUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.hashing;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class Keccak256HashingUnitTest {
+
+ private static String originalValue = "abc123";
+ private static String hashedValue = "719accc61a9cc126830e5906f9d672d06eab6f8597287095a2c55a8b775e7016";
+
+ @Test public void testHashWithJavaMessageDigest() throws Exception {
+ final String currentHashedValue = Keccak256Hashing.hashWithJavaMessageDigest(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ @Test public void testHashWithBouncyCastle() {
+ final String currentHashedValue = Keccak256Hashing.hashWithBouncyCastle(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+}
diff --git a/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
index 3c34bf2c6e..6bc9ad2cc6 100644
--- a/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
+++ b/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java
@@ -12,24 +12,24 @@ public class SHA256HashingUnitTest {
@Test
public void testHashWithJavaMessageDigest() throws Exception {
final String currentHashedValue = SHA256Hashing.HashWithJavaMessageDigest(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ assertEquals(hashedValue, currentHashedValue);
}
@Test
public void testHashWithGuava() throws Exception {
- final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ final String currentHashedValue = SHA256Hashing.hashWithGuava(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
}
@Test
public void testHashWithApacheCommans() throws Exception {
- final String currentHashedValue = SHA256Hashing.HashWithGuava(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
}
@Test
public void testHashWithBouncyCastle() throws Exception {
final String currentHashedValue = SHA256Hashing.HashWithBouncyCastle(originalValue);
- assertEquals(currentHashedValue, hashedValue);
+ assertEquals(hashedValue, currentHashedValue);
}
}
\ No newline at end of file
diff --git a/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java
new file mode 100644
index 0000000000..fffab96405
--- /dev/null
+++ b/core-java-security/src/test/java/com/baeldung/hashing/SHA3HashingUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.hashing;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class SHA3HashingUnitTest {
+
+ private static String originalValue = "abc123";
+ private static String hashedValue = "f58fa3df820114f56e1544354379820cff464c9c41cb3ca0ad0b0843c9bb67ee";
+
+ /* works with JDK9+ only */
+ //@Test
+ public void testHashWithJavaMessageDigestJDK9() throws Exception {
+ final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigestJDK9(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ @Test
+ public void testHashWithJavaMessageDigest() throws Exception {
+ final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigest(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ /* works with JDK9+ only */
+ //@Test
+ public void testHashWithApacheCommonsJDK9() {
+ final String currentHashedValue = SHA3Hashing.hashWithApacheCommonsJDK9(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+ @Test
+ public void testHashWithBouncyCastle() {
+ final String currentHashedValue = SHA3Hashing.hashWithBouncyCastle(originalValue);
+ assertEquals(hashedValue, currentHashedValue);
+ }
+
+}