Tại sao cần hash
Chúng ta hash để chủ yếu cho mục đích là validation (kiểm tra tính toàn vẹn) của dữ liệu. Thường được dùng cho việc xác định file truyền đi có bị mất mát hay thay đổi dữ liệu, hoặc hay dùng trong xác thực mật khẩu. Về bản chất của hash là hàm băm, hàm chỉ mã hoá, không dịch ngượuc lại được. Với cùng 1 một dữ liệu đầu vào thì sẽ có duy nhất một dữ liệu đầu ra, ngược lại thì có thể sai, vì hai dữ liệu vào khác nhau thì có thể cho ra cùng một giá trị băm như nhau (tuỳ thuộc vào thuật toán băm). Thuật toán càng xịn thì độ đụng độ càng thấp nhưng bù lại thời gian băm lại lâu. À nói vậy thôi chứ đừng có lưu mật khẩu mà chỉ băm thôi nha, vì có thể dò ra từ hash table, nên để lưu mật khẩu người ta hay thêm salt (muối) và pepper (tiêu ấy) nữa cho an toàn, chắc mình sẽ viết thêm một bài khác.
Ở bài này mình sẽ hướng dẫn các bạn hiện thực trên Java bằng cả 2 cách là không dùng thêm thư viện ngoài và dùng thư viện ngoài
Không dùng thư viện ngoài
try {
String s = "ahihi";
MessageDigest digest = MessageDigest.getInstance("SHA-256");
// replay MD5, SHA-512
byte[] hash = digest.digest(s.getBytes(StandardCharsets.UTF_8));
String rs = DatatypeConverter.printHexBinary(hash);
System.out.println(rs);
} catch (NoSuchAlgorithmException e) {
}
Chúng ta sẽ khởi tạo một MessageDigest là nơi khai báo kiểu hash của chúng ta.
Sau đó lấy byte của string (lấy với định dạng UTF-8) và dùng giá trị đó hash ra từ MessageDigest đã khởi tạo ở trên
Sau đó dùng hàm DatatypeConverter.printHexBinary để lấy giá trị hex từ cái byte kia là xong.
Ở đây chúng ta đặt vào try catch hoặc throw Exception là NoSuchAlgorithmException có nghĩa là sai thuật toán hash (đại loại là sai tên hoặc sai cú pháp tên SHA-ahihi chẳng hạn)
Dùng thư viện
Chắc chắn là dùng thư viện sẽ đơn giản hơn nhiều rồi, nhưng mà phải tải và thêm vào project, tuỳ cách chọn thôi.
https://mvnrepository.com/artifact/commons-codec/commons-codec/1.13
Ai dùng maven thì add dependency vào là xong, còn Ant thì download file Jav về nha
String s = "ahihi";String rs = DigestUtils.sha256Hex(s);//String rs = DigestUtils.md5Hex(s)System.out.println(rs);
Đơn giản quá phải không
Vậy là ở bài này, mình đã hướng dẫn hash cơ bản bằng cả hai cách. Hy vọng bài viết của mình sẽ giúp ích được các bạn.