Skip to content

Commit 034869f

Browse files
aietcnmaibin
authored andcommitted
BAEL-2501 add a new section in SHA-256 article (eugenp#6271)
1 parent 52db7dd commit 034869f

9 files changed

Lines changed: 174 additions & 21 deletions

File tree

core-java-security/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444

4545
<!-- util -->
4646
<commons-lang3.version>3.8.1</commons-lang3.version>
47-
<bouncycastle.version>1.55</bouncycastle.version>
48-
<commons-codec.version>1.10</commons-codec.version>
47+
<bouncycastle.version>1.60</bouncycastle.version>
48+
<commons-codec.version>1.11</commons-codec.version>
4949

5050
<!-- testing -->
5151
<assertj-core.version>3.10.0</assertj-core.version>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.baeldung.hashing;
2+
3+
public class DigestAlgorithms {
4+
5+
public static final String SHA3_256 = "SHA3-256";
6+
public static final String SHA_256 = "SHA-256";
7+
public static final String KECCAK_256 = "Keccak-256";
8+
9+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.baeldung.hashing;
2+
3+
import org.bouncycastle.jcajce.provider.digest.Keccak;
4+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
5+
import org.bouncycastle.util.encoders.Hex;
6+
7+
import java.nio.charset.StandardCharsets;
8+
import java.security.MessageDigest;
9+
import java.security.NoSuchAlgorithmException;
10+
import java.security.Security;
11+
12+
import static com.baeldung.hashing.DigestAlgorithms.KECCAK_256;
13+
import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
14+
15+
public class Keccak256Hashing {
16+
17+
public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
18+
Security.addProvider(new BouncyCastleProvider());
19+
final MessageDigest digest = MessageDigest.getInstance(KECCAK_256);
20+
final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
21+
return bytesToHex(encodedhash);
22+
}
23+
24+
public static String hashWithBouncyCastle(final String originalString) {
25+
Keccak.Digest256 digest256 = new Keccak.Digest256();
26+
byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8));
27+
return new String(Hex.encode(hashbytes));
28+
}
29+
30+
}

core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@
88
import java.security.MessageDigest;
99
import java.security.NoSuchAlgorithmException;
1010

11+
import static com.baeldung.hashing.DigestAlgorithms.SHA_256;
12+
import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
13+
1114
public class SHA256Hashing {
1215

1316
public static String HashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
14-
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
17+
final MessageDigest digest = MessageDigest.getInstance(SHA_256);
1518
final byte[] encodedhash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
1619
return bytesToHex(encodedhash);
1720
}
1821

19-
public static String HashWithGuava(final String originalString) {
22+
public static String hashWithGuava(final String originalString) {
2023
final String sha256hex = Hashing.sha256().hashString(originalString, StandardCharsets.UTF_8).toString();
2124
return sha256hex;
2225
}
@@ -27,20 +30,10 @@ public static String HashWithApacheCommons(final String originalString) {
2730
}
2831

2932
public static String HashWithBouncyCastle(final String originalString) throws NoSuchAlgorithmException {
30-
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
33+
final MessageDigest digest = MessageDigest.getInstance(SHA_256);
3134
final byte[] hash = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
3235
final String sha256hex = new String(Hex.encode(hash));
3336
return sha256hex;
3437
}
3538

36-
private static String bytesToHex(byte[] hash) {
37-
StringBuffer hexString = new StringBuffer();
38-
for (int i = 0; i < hash.length; i++) {
39-
String hex = Integer.toHexString(0xff & hash[i]);
40-
if (hex.length() == 1)
41-
hexString.append('0');
42-
hexString.append(hex);
43-
}
44-
return hexString.toString();
45-
}
4639
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.baeldung.hashing;
2+
3+
import com.google.common.hash.Hashing;
4+
import org.apache.commons.codec.digest.DigestUtils;
5+
import org.bouncycastle.crypto.digests.SHA3Digest;
6+
import org.bouncycastle.jcajce.provider.digest.SHA3;
7+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
8+
import org.bouncycastle.util.encoders.Hex;
9+
10+
import java.nio.charset.StandardCharsets;
11+
import java.security.MessageDigest;
12+
import java.security.NoSuchAlgorithmException;
13+
import java.security.Security;
14+
15+
import static com.baeldung.hashing.DigestAlgorithms.SHA3_256;
16+
import static com.baeldung.hashing.SHACommonUtils.bytesToHex;
17+
18+
public class SHA3Hashing {
19+
20+
/* works with JDK9+ only */
21+
public static String hashWithJavaMessageDigestJDK9(final String originalString) throws NoSuchAlgorithmException {
22+
final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
23+
final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
24+
return bytesToHex(hashbytes);
25+
}
26+
27+
public static String hashWithJavaMessageDigest(final String originalString) throws NoSuchAlgorithmException {
28+
Security.addProvider(new BouncyCastleProvider());
29+
final MessageDigest digest = MessageDigest.getInstance(SHA3_256);
30+
final byte[] hashbytes = digest.digest(originalString.getBytes(StandardCharsets.UTF_8));
31+
return bytesToHex(hashbytes);
32+
}
33+
34+
/* works with JDK9+ only */
35+
public static String hashWithApacheCommonsJDK9(final String originalString) {
36+
return new DigestUtils(SHA3_256).digestAsHex(originalString);
37+
}
38+
39+
public static String hashWithBouncyCastle(final String originalString) {
40+
SHA3.Digest256 digest256 = new SHA3.Digest256();
41+
byte[] hashbytes = digest256.digest(originalString.getBytes(StandardCharsets.UTF_8));
42+
return new String(Hex.encode(hashbytes));
43+
}
44+
45+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.baeldung.hashing;
2+
3+
class SHACommonUtils {
4+
5+
public static String bytesToHex(byte[] hash) {
6+
StringBuffer hexString = new StringBuffer();
7+
for (byte h : hash) {
8+
String hex = Integer.toHexString(0xff & h);
9+
if (hex.length() == 1)
10+
hexString.append('0');
11+
hexString.append(hex);
12+
}
13+
return hexString.toString();
14+
}
15+
16+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.baeldung.hashing;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.assertEquals;
6+
7+
public class Keccak256HashingUnitTest {
8+
9+
private static String originalValue = "abc123";
10+
private static String hashedValue = "719accc61a9cc126830e5906f9d672d06eab6f8597287095a2c55a8b775e7016";
11+
12+
@Test public void testHashWithJavaMessageDigest() throws Exception {
13+
final String currentHashedValue = Keccak256Hashing.hashWithJavaMessageDigest(originalValue);
14+
assertEquals(hashedValue, currentHashedValue);
15+
}
16+
17+
@Test public void testHashWithBouncyCastle() {
18+
final String currentHashedValue = Keccak256Hashing.hashWithBouncyCastle(originalValue);
19+
assertEquals(hashedValue, currentHashedValue);
20+
}
21+
22+
}

core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,24 @@ public class SHA256HashingUnitTest {
1212
@Test
1313
public void testHashWithJavaMessageDigest() throws Exception {
1414
final String currentHashedValue = SHA256Hashing.HashWithJavaMessageDigest(originalValue);
15-
assertEquals(currentHashedValue, hashedValue);
15+
assertEquals(hashedValue, currentHashedValue);
1616
}
1717

1818
@Test
1919
public void testHashWithGuava() throws Exception {
20-
final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue);
21-
assertEquals(currentHashedValue, hashedValue);
20+
final String currentHashedValue = SHA256Hashing.hashWithGuava(originalValue);
21+
assertEquals(hashedValue, currentHashedValue);
2222
}
2323

2424
@Test
2525
public void testHashWithApacheCommans() throws Exception {
26-
final String currentHashedValue = SHA256Hashing.HashWithGuava(originalValue);
27-
assertEquals(currentHashedValue, hashedValue);
26+
final String currentHashedValue = SHA256Hashing.HashWithApacheCommons(originalValue);
27+
assertEquals(hashedValue, currentHashedValue);
2828
}
2929

3030
@Test
3131
public void testHashWithBouncyCastle() throws Exception {
3232
final String currentHashedValue = SHA256Hashing.HashWithBouncyCastle(originalValue);
33-
assertEquals(currentHashedValue, hashedValue);
33+
assertEquals(hashedValue, currentHashedValue);
3434
}
3535
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.baeldung.hashing;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.assertEquals;
6+
7+
public class SHA3HashingUnitTest {
8+
9+
private static String originalValue = "abc123";
10+
private static String hashedValue = "f58fa3df820114f56e1544354379820cff464c9c41cb3ca0ad0b0843c9bb67ee";
11+
12+
/* works with JDK9+ only */
13+
//@Test
14+
public void testHashWithJavaMessageDigestJDK9() throws Exception {
15+
final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigestJDK9(originalValue);
16+
assertEquals(hashedValue, currentHashedValue);
17+
}
18+
19+
@Test
20+
public void testHashWithJavaMessageDigest() throws Exception {
21+
final String currentHashedValue = SHA3Hashing.hashWithJavaMessageDigest(originalValue);
22+
assertEquals(hashedValue, currentHashedValue);
23+
}
24+
25+
/* works with JDK9+ only */
26+
//@Test
27+
public void testHashWithApacheCommonsJDK9() {
28+
final String currentHashedValue = SHA3Hashing.hashWithApacheCommonsJDK9(originalValue);
29+
assertEquals(hashedValue, currentHashedValue);
30+
}
31+
32+
@Test
33+
public void testHashWithBouncyCastle() {
34+
final String currentHashedValue = SHA3Hashing.hashWithBouncyCastle(originalValue);
35+
assertEquals(hashedValue, currentHashedValue);
36+
}
37+
38+
}

0 commit comments

Comments
 (0)