Mã hóa SHA-256 trong Java

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

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x