SHA-256 dan SHA3-256 Hashing di Java

Java Teratas

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

>> SEMAK KURSUS

1. Gambaran keseluruhan

SHA (Secure Hash Algorithm) adalah salah satu fungsi hash kriptografi yang popular. Hash kriptografi boleh digunakan untuk membuat tanda tangan untuk teks atau fail data. Dalam tutorial ini, mari kita lihat bagaimana kita dapat melakukan operasi hash SHA-256 dan SHA3-256 menggunakan pelbagai perpustakaan Java.

Algoritma SHA-256 menghasilkan hash 256-bit (32-byte) bersaiz tetap yang hampir unik. Ini adalah fungsi sehala, jadi hasilnya tidak dapat didekripsi kembali ke nilai semula.

Pada masa ini, hash SHA-2 digunakan secara meluas kerana dianggap sebagai algoritma hash paling selamat di arena kriptografi.

SHA-3 adalah standard hashing selamat terkini selepas SHA-2. Berbanding dengan SHA-2, SHA-3 memberikan pendekatan yang berbeza untuk menghasilkan hash sehala yang unik, dan ia dapat lebih cepat pada beberapa implementasi perkakasan. Mirip dengan SHA-256, SHA3-256 adalah algoritma panjang tetap 256-bit dalam SHA-3.

NIST mengeluarkan SHA-3 pada tahun 2015, oleh itu buat masa ini tidak banyak pustaka SHA-3 seperti SHA-2. Tidak sampai JDK 9 algoritma SHA-3 tersedia dalam penyedia lalai terbina dalam.

Sekarang, mari kita mulakan dengan SHA-256.

2. MessageDigest Class di Jawa

Java menyediakan kelas MessageDigest terbina dalam untuk hash SHA-256:

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

Walau bagaimanapun, di sini kita harus menggunakan penukar byte ke hex tersuai 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 sedar, bahawa MessageDigest tidak selamat di dalam benang . Oleh itu, kita harus menggunakan contoh baru untuk setiap utas.

3. Perpustakaan Jambu Batu

Perpustakaan Jambu Batu Google juga menyediakan kelas utiliti untuk hashing.

Pertama, mari tentukan pergantungan:

 com.google.guava guava 20.0 

Sekarang, inilah caranya kita dapat menggunakan Jambu Batu untuk mencantumkan String:

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

4. Kodec Apache Commons

Begitu juga, kita juga boleh menggunakan Codec Apache Commons:

 commons-codec commons-codec 1.11 

Inilah kelas utiliti - yang disebut DigestUtils - yang menyokong hash SHA-256:

String sha256hex = DigestUtils.sha256Hex(originalString);

5. Perpustakaan Bouncy Castle

5.1. Ketergantungan Maven

 org.bouncycastle bcprov-jdk15on 1.60 

5.2. Menipu Menggunakan Perpustakaan Bouncy Castle

API Bouncy Castle menyediakan kelas utiliti untuk menukar data hex menjadi bait dan kembali lagi.

Namun, diperlukan untuk mengisi ringkasan menggunakan Java API bawaan 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 teruskan dengan SHA3-256. SHA3-256 hashing di Java tidak jauh berbeza dengan SHA-256.

6.1. Kelas MessageDigest di Jawa

Bermula dari JDK 9, kita hanya boleh menggunakan algoritma SHA3-256 terbina dalam:

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

6.2. Kodec Apache Commons

Apache Commons Codecs menyediakan pembungkus DigestUtils yang selesa untuk kelas MessageDigest . Perpustakaan ini mula menyokong 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 hash SHA3-256 yang lain. Pada masa ini, ia berfungsi sebagai alternatif kepada SHA3-256 standard. Keccak-256 memberikan tahap keamanan yang sama dengan SHA3-256 standard, dan berbeza dengan SHA3-256 hanya pada aturan padding. Ini telah digunakan dalam beberapa projek blockchain, seperti Monoro.

Sekali lagi, kita perlu mengimport Perpustakaan Bouncy Castle untuk menggunakan hash 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);

Kami juga dapat menggunakan API Bouncy Castle 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. Kesimpulannya

Dalam artikel ringkas ini, kami telah melihat beberapa cara untuk menerapkan hash SHA-256 dan SHA3-256 di Java, dengan menggunakan perpustakaan bawaan dan pihak ketiga.

Kod sumber contoh di atas boleh didapati di projek GitHub.

Bahagian bawah Java

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

>> SEMAK KURSUS