SHA-256 dan SHA3-256 Hashing di Java

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

SHA (Secure Hash Algorithm) adalah salah satu fungsi hash kriptografi yang populer. Hash kriptografi dapat digunakan untuk membuat tanda tangan untuk teks atau file data. Dalam tutorial ini, mari kita lihat bagaimana kita dapat melakukan operasi hashing SHA-256 dan SHA3-256 menggunakan berbagai library Java.

Algoritme SHA-256 menghasilkan hash 256-bit (32-byte) yang hampir unik dan berukuran tetap. Ini adalah fungsi satu arah, jadi hasilnya tidak dapat didekripsi kembali ke nilai aslinya.

Saat ini, hashing SHA-2 banyak digunakan karena dianggap sebagai algoritme hashing paling aman di arena kriptografi.

SHA-3 adalah standar hashing aman terbaru setelah SHA-2. Dibandingkan dengan SHA-2, SHA-3 menyediakan pendekatan yang berbeda untuk menghasilkan hash satu arah yang unik, dan ini bisa menjadi lebih cepat pada beberapa implementasi perangkat keras. Mirip dengan SHA-256, SHA3-256 adalah algoritme panjang tetap 256-bit di SHA-3.

NIST merilis SHA-3 pada tahun 2015, jadi pustaka SHA-3 tidak sebanyak SHA-2 untuk saat ini. Baru pada JDK 9 algoritme SHA-3 tersedia di penyedia default bawaan.

Sekarang, mari kita mulai dengan SHA-256.

2. Kelas MessageDigest di Java

Java menyediakan kelas MessageDigest bawaan untuk hashing SHA-256:

MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));

Namun, di sini kita harus menggunakan konverter byte ke hex khusus untuk mendapatkan nilai hash dalam heksadesimal:

private static String bytesToHex(byte[] hash) { StringBuilder hexString = new StringBuilder(2 * hash.length); 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(); }

Kita perlu menyadari, bahwa MessageDigest tidak aman untuk thread . Akibatnya, kita harus menggunakan contoh baru untuk setiap utas.

3. Perpustakaan Jambu Biji

Pustaka Google Guava juga menyediakan kelas utilitas untuk pencirian.

Pertama, mari tentukan dependensi:

 com.google.guava guava 20.0 

Sekarang, inilah cara kita menggunakan Guava untuk melakukan hash pada String:

String sha256hex = Hashing.sha256() .hashString(originalString, StandardCharsets.UTF_8) .toString();

4. Codec Apache Commons

Demikian pula, kami juga dapat menggunakan Codec Apache Commons:

 commons-codec commons-codec 1.11 

Inilah kelas utilitas - disebut DigestUtils - yang mendukung pencirian SHA-256:

String sha256hex = DigestUtils.sha256Hex(originalString);

5. Perpustakaan Bouncy Castle

5.1. Ketergantungan Maven

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Hashing Menggunakan Perpustakaan Istana Bouncy

Bouncy Castle API menyediakan kelas utilitas untuk mengonversi data hex menjadi byte dan kembali lagi.

Namun, diperlukan untuk mengisi intisari menggunakan Java API built-in terlebih dahulu:

MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] hash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha256hex = new String(Hex.encode(hash));

6. SHA3-256

Sekarang mari kita lanjutkan dengan SHA3-256. Hash SHA3-256 di Java tidak jauh berbeda dari SHA-256.

6.1. Kelas MessageDigest di Java

Mulai dari JDK 9, kita cukup menggunakan algoritma SHA3-256 built-in:

final MessageDigest digest = MessageDigest.getInstance("SHA3-256"); final byte[] hashbytes = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(hashbytes);

6.2. Codec Apache Commons

Apache Commons Codecs menyediakan pembungkus DigestUtils yang nyaman untuk kelas MessageDigest . Pustaka ini mulai mendukung SHA3-256 sejak versi 1.11, dan memerlukan JDK 9+ juga:

String sha3Hex = new DigestUtils("SHA3-256").digestAsHex(originalString);

6.3. Keccak-256

Keccak-256 adalah algoritma hashing SHA3-256 populer lainnya. Saat ini, ini berfungsi sebagai alternatif dari SHA3-256 standar. Keccak-256 memberikan tingkat keamanan yang sama dengan SHA3-256 standar, dan ini berbeda dari SHA3-256 hanya pada aturan padding. Ini telah digunakan di beberapa proyek blockchain, seperti Monoro.

Sekali lagi, kita perlu mengimpor Perpustakaan Istana Bouncy untuk menggunakan hashing Keccak-256:

Security.addProvider(new BouncyCastleProvider()); final MessageDigest digest = MessageDigest.getInstance("Keccak-256"); final byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = bytesToHex(encodedhash);

Kita juga dapat menggunakan Bouncy Castle API untuk melakukan hashing:

Keccak.Digest256 digest256 = new Keccak.Digest256(); byte[] hashbytes = digest256.digest( originalString.getBytes(StandardCharsets.UTF_8)); String sha3Hex = new String(Hex.encode(hashbytes));

7. Kesimpulan

Dalam artikel singkat ini, kami telah melihat beberapa cara untuk mengimplementasikan hashing SHA-256 dan SHA3-256 di Java, menggunakan pustaka bawaan dan pihak ketiga.

Kode sumber dari contoh di atas dapat ditemukan di proyek GitHub.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya