MD5 là một hàm băm mật mã theo chuẩn RFC 1321 được sử dụng rộng rãi, tạo ra một mã băm128 bit. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu cách sử dụng MD5 qua nhiều cách khác nhau.
MD5 Using MessageDigest Class
Trong java.security.MessageDigest class cung cấp một hàm băm nhận vào một thuật toán để thực thi.
MessageDigest.getInstance(String Algorithm)
Sau đó hàm update() được sử dụng để nhận chuỗi đầu vào cần được mã hóa.
public void update(byte [] input)
Cuối cùng chúng ta sử dụng digest() để tạo ra mã băm cho chuỗi cần mã hóa
import javax.xml.bind.DatatypeConverter; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Main { public static void main( String args[] ) throws NoSuchAlgorithmException { String password = "DeftBlog"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte[] digest = md.digest(); String myHash = DatatypeConverter .printHexBinary(digest).toUpperCase(); System.out.println("My Hash: " + myHash); } }
Output
My Hash: 2B95EBA6BA37DAB56CC03660404AA729
Xác nhận mật khẩu với MD5
Trong ví dụ trên mình đã mã hóa mật khẩu với MD5, giả sử khi người dùng nhập lại mật khẩu “DeftBlog” mà trước đây họ đã đăng ký trong khi chúng ta chỉ lưu lại mật khẩu đã mã hóa trong database thì làm cách nào đây?
Rất đơn giản, chúng ta lại sử dụng MD5 để mã hóa mật khẩu mà người dùng đã nhập vào sau đó so sánh với mã hash trong database, nếu giống nhau tất là người dùng đã nhập mật khẩu đúng.
import javax.xml.bind.DatatypeConverter; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class Main { public static void main(String args[]) throws NoSuchAlgorithmException { System.out.println("Verify: " + verify("DeftBlog", "2B95EBA6BA37DAB56CC03660404AA729")); } public static boolean verify(String inputPassword, String hashPassWord) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(inputPassword.getBytes()); byte[] digest = md.digest(); String myChecksum = DatatypeConverter .printHexBinary(digest).toUpperCase(); return hashPassWord.equals(myChecksum); } }
Output
Verify: true
MD5 Using Apache Commons
Class org.apache.commons.codec.digest.DigestUtils cung cấp cho chúng ta các method mã hóa MD5 dễ sử dụng và ngắn gọn hơn so với cách trên.
Để sử dụng chúng ta cần commons-codec dependency vào project maven hoặc có thể tải file jar và import vào project tùy cách các bạn sử dụng.
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.14</version> </dependency>
Sau khi thêm commons-codec vào dự án, chúng ta có thể dễ dàng sử dụng MD5 với DigestUtils class cách nhanh gọn và đơn giản.
import org.apache.commons.codec.digest.DigestUtils; public class Main { public static void main(String args[]) { String hash = "2B95EBA6BA37DAB56CC03660404AA729"; String password = "DeftBlog"; String md5Hex = DigestUtils .md5Hex(password).toUpperCase(); System.out.println("Hash: " + md5Hex); System.out.println("Verify: " + hash.equals(md5Hex)); } }
Nguồn tham khảo
https://www.baeldung.com/java-md5