Giải thuật SHA (Secure Hash Algorithm) là một trong những hàm băm mật mã được sử dụng phổ biến. Một hàm băm mật mã có thể được sử dụng để tạo một chữ ký cho một đoạn văn bản hay một file text. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách sử dụng SHA-256 và SHA3-256 một phiên bản nâng cấp của SHA-256.
Thuật toán SHA-256 tạo ra một mã hash 256 bit (32 byte) gần như duy nhất, có kích thước cố định. Đây là hàm mã hóa một chiều nên không thể giải mã kết quả trở về giá trị ban đầu.
Bây giờ, hãy bắt đầu với SHA-256.
MessageDigest Class – SHA-256
Java cung cấp lớp MessageDigest có sẵn để sử dụng SHA-256:
MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8));
Tuy nhiên, ở đây chúng ta phải sử dụng bộ chuyển đổi byte sang hex tùy chỉnh để nhận giá trị băm trong hệ thập lục phân:
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(); }
Chúng ta cần lưu ý rằng MessageDigest không phải là thread-safe. Do đó, chúng ta nên tạo một instance cho mỗi thread khác nhau.
Ví dụ Băm mật khẩu DeftBlog sử dụng SHA-256
import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Main { public static void main(String args[]) throws NoSuchAlgorithmException { String originalString = "DeftBlog"; MessageDigest digest = MessageDigest.getInstance("SHA-256"); byte[] encodedhash = digest.digest( originalString.getBytes(StandardCharsets.UTF_8)); System.out.println("Hash: " + bytesToHex(encodedhash)); } 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(); } }
Output
Hash: b5483a696f41f9f884a538b9121874f752fc73a1e2ca5340c74aae4575e05de8
Guava – SHA256
Thư viện Google Guava cũng cung cấp một class tiện ích để sử dụng SHA-256 cách nhanh chóng hơn so với cách trên.
Đầu tiên chúng ta cần thêm dependency của nó vào project maven.
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>20.0</version> </dependency>
Giờ đây, chúng ta có thể sử dụng SHA-256 bằng cách sau:
import com.google.common.hash.Hashing; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; public class Main { public static void main(String args[]) throws NoSuchAlgorithmException { String originalString = "DeftBlog"; String sha256hex = Hashing.sha256() .hashString(originalString, StandardCharsets.UTF_8) .toString(); System.out.println("Hash: " + sha256hex); } }
Output
Hash: b5483a696f41f9f884a538b9121874f752fc73a1e2ca5340c74aae4575e05de8
Apache Commons Codecs – SHA256
Tương tự, chúng ta cũng có thể sử dụng Apache Commons Codecs:
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency>
Sử dụng DigestUtils class.
import org.apache.commons.codec.digest.DigestUtils; import java.security.NoSuchAlgorithmException; public class Main { public static void main(String args[]) throws NoSuchAlgorithmException { String originalString = "DeftBlog"; String sha256hex = DigestUtils.sha256Hex(originalString); System.out.println("Hash: " + sha256hex); } }
Nguồn tham khảo
https://www.baeldung.com/sha-256-hashing-java