Mã hoá MD5 trong Java

MD5 là gì?

Trong mật mã học, MD5 (viết tắt của tiếng Anh Message-Digest algorithm 5, giải thuật Tiêu hóa tin 5) là một hàm băm mật mã học được sử dụng phổ biến với giá trị Hash dài 128-bit. Là một chuẩn Internet (RFC 1321), MD5 đã được dùng trong nhiều ứng dụng bảo mật, và cũng được dùng phổ biến để kiểm tra tính toàn vẹn của tập tin. Một bảng băm MD5 thường được diễn tả bằng một số hệ thập lục phân 32 ký tự.

MD5 được thiết kế bởi Ronald Rivest vào năm 1991 để thay thế cho hàm băm trước đó, MD4. Vào năm 1996, người ta phát hiện ra một lỗ hổng trong MD5; trong khi vẫn chưa biết nó có phải là lỗi nghiêm trọng hay không, những chuyên gia mã hóa bắt đầu đề nghị sử dụng những giải thuật khác, như SHA-1 (khi đó cũng bị xem là không an toàn). Trong năm 2004, nhiều lỗ hổng hơn bị khám phá khiến cho việc sử dụng giải thuật này cho mục đích bảo mật đang bị đặt nghi vấn.

Ứng dụng của MD5

  • Đảm bảo tính toàn vẹn, tạo chuỗi kiểm tra lỗi. (Ví dụ khi tải một tệp trên mạng bạn thường thấy người ta cung cấp kèm 1 chuỗi MD5 tương ứng, sau khi download về ta sẽ băm lại file để kiểm tra chuỗi MD5 có bị thay đổi không, nếu đã bị thay đổi tức là trong quá trình download file đã bị thiếu một phần nào đó hoặc file đã bị chỉnh sửa (chèn virus, crack…)).
  • Mã hóa mật khẩu. (Các thông tin nhạy cảm như mật khẩu, thẻ ngân hàng… thường sẽ được mã hóa trước khi lưu vào database, nếu hacker truy cập được vào database cũng sẽ không lấy được các thông tin đó. Khi sử dụng, ví dụ khi đăng nhập ta sẽ băm mật khẩu thành một chuỗi MD5 và so sánh nó với chuỗi MD5 trong database để xác thực)

Sử dụng MD5 trong Java

Để băm một đối tượng trong Java sử dụng MD5 ta sử dụng class java.security.MessageDigest. Nó nhận đầu vào là một mảng byte và kết quả trả về là một mảng byte đã được băm.

import java.math.BigInteger; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;

public class Md5Demo {
  public static void main(String[] args) {
    System.out.print("Input password: ");
    Scanner kb = new Scanner(System.in);
    String pass = kb.nextLine();
    System.out.println("Your Password generated by MD5 is: " + getMd5(pass));
    kb.close();
  }
  public static String getMd5(String input) 
    { 
        try { 
            // Static getInstance method is called with hashing MD5 
            MessageDigest md = MessageDigest.getInstance("MD5"); 
  
            // digest() method is called to calculate message digest 
            //  of an input digest() return array of byte 
            byte[] messageDigest = md.digest(input.getBytes()); 
  
            // Convert byte array into signum representation 
            BigInteger no = new BigInteger(1, messageDigest); 
  
            // Convert message digest into hex value 
            String hashtext = no.toString(16); 
            while (hashtext.length() < 32) { 
                hashtext = "0" + hashtext; 
            } 
            return hashtext; 
        }  
        // For specifying wrong message digest algorithms 
        catch (NoSuchAlgorithmException e) { 
            throw new RuntimeException(e); 
        } 
    }
}