THUẬT TOÁN MÃ HÓA MD5

 

  1. MD5 là gì

MD5 (Message-Digest algorithm 5) là một thuật toán mã hoá, theo chuẩn RFC 1321 (http://tools.ietf.org/html/rfc1321). Các chương trình mã hoá (tính) MD5 thường được gọi là MD5 CheckSum. Nó được dùng để tạo ra một chuỗi 128 bit duy nhất từ một chuỗi dữ liệu nhập bất kỳ, và vì thế thường được dùng để kiểm tra tính toàn vẹn dữ liệu của một tập tin. Nói một cách đơn giản, nếu tập tin bạn tải về có mã MD5 (thường được biểu diễn bằng 32 ký tự thập lục phân – tương đương 128 bit) khác với MD5 đã được công bố, thì tập tin bạn tải về khác với tập tin gốc. Nghĩa là quá trình download đã bị lỗi khiến tải không đủ, hoặc tập tin đã bị sửa đổi (chèn trojan, virus, ..v.v..) so với bản nguyên thủy có MD5 đã đưa lên.


  1. Ứng dụng

Các đồng hóa MD5 được dùng rộng rãi trong các phần mềm trên toàn thế giới để đảm bảo việc truyền tập tin được nguyên vẹn. Ví dụ, máy chủ tập tin thường cung cấp một checksum MD5 được tính toán trước cho tập tin, để người dùng có thể so sánh với checksum của tập tin đã tải về. Những hệ điều hành dựa trên nền tảng Unix luôn kèm theo tính năng MD5 sum trong các gói phân phối của họ, trong khi người dùng Windows sử dụng ứng dụng của hãng thứ ba.

Tuy nhiên, hiện nay dễ dàng tạo ra xung đột MD5, một người có thể tạo ra một tập tin để tạo ra tập tin thứ hai với cùng một checksum, do đó kỹ thuật này không thể chống lại một vài dạng giả mạo nguy hiểm. Ngoài ra, trong một số trường hợp checksum không thể tin tưởng được (ví dụ, nếu nó được lấy từ một lệnh như tập tin đã tải về), trong trường hợp đó MD5 chỉ có thể có chức năng kiểm tra lỗi: nó sẽ nhận ra một lỗi hoặc tải về chưa xong, rất dễ xảy ra khi tải tập tin lớn.

MD5 được dùng rộng rãi để lưu trữ mật khẩu. Để giảm bớt sự dễ thương tổn đề cập ở trên, ta có thể thêm một chuỗi vào mật khẩu trước khi băm chúng. Một vài hiện thực có thể áp dụng vào hàm băm hơn một lần-xem làm mạnh thêm khóa.

  1. Lấy mã MD5 trong C#

Giải thuật của MD5 cũng khá phức tạp và việc cài đặt trong C# cũng không đơn giản. May mắn thay, .NET hầu như đã làm sẵn cho chúng ta mọi việc. Tất cả đều gói gọn trong lớp MD5 nằm trong namespace System.Security.Cryptography. Trong bài viết này, tôi sẽ hướng dẫn các bạn sử dụng lớp này để viết một ứng dụng tạo mã MD5 cho một chuỗi và cho một file.

Đầu tiên, ta sẽ viết lớp MD5Encoder bao gồm 2 phương thức tĩnh đùng để mã hóa chuỗi và file với lớp MD5. Đây là một lớp trừu tượng nên bạn không thể kế thừa nó.

Code

class MD5Encoder

{

    public static string FromString(string Message)

    {

        //tạo đối tượng mã hóa MD5

        MD5 MyMD5 = MD5.Create();

        //mã hóa mảng byte bằng MD5

        byte[] HashCode = MyMD5.ComputeHash(Encoding.Unicode.GetBytes(Message));

        //chuyển mảng byte thành chuỗi

        StringBuilder SB = new StringBuilder();

        for (int i = 0; i < HashCode.Length; i++)

            SB.Append(HashCode[i].ToString(“x2”));

        return SB.ToString();

    }

    public static string FromFile(string FilePath)

    {

        //tạo đối tượng mã hóa MD5

        MD5 MyMD5 = MD5.Create();

        //đọc file

        FileStream fs = new FileStream(FilePath, FileMode.Open);

        //mã hóa mảng byte bằng MD5

        byte[] HashCode = MyMD5.ComputeHash(fs);

        //chuyển mảng byte thành chuỗi

        StringBuilder SB = new StringBuilder();

        for (int i = 0; i < HashCode.Length; i++)

            SB.Append(HashCode[i].ToString(“x2”));

        return SB.ToString();

    }

}

Phương thức ComputeHash của lớp MD5 nhận đầu vào là một mảng byte hoặc một luồng (stream) bất kỳ và trả về một mảng kết quả gồm 16 byte. Nhưng kết quả mà ta mong muốn lại là một chuỗi gồm 32 ký tự. Lệnh HashCode[i].ToString(“x2”) có nhiệm vụ chuyển byte tương ứng của mảng kết quả thành một chuỗi Hexa gồm 2 ký tự. Như vậy, với 16 byte, ta sẽ có được chuỗi 32 ký tự.

Sau đó, cài đặt sự kiện cho các control :

Code

private void cmdEncodeString_Click(object sender, EventArgs e)

{

    txtResult.Text = MD5Encoder.FromString(txtMessage.Text);

}

private void cmdEncodeFile_Click(object sender, EventArgs e)

{

    if (File.Exists(txtFilePath.Text))

        txtResult.Text = MD5Encoder.FromFile(txtFilePath.Text);

    else

        MessageBox.Show(“Không tìm thấy file”);

}

private void cmdFindFile_Click(object sender, EventArgs e)

{

    OpenFileDialog dlgFile = new OpenFileDialog();

    dlgFile.Title = “Chọn file”;

    dlgFile.Filter = “Tất cả (.)|.“;

    dlgFile.FilterIndex = 0;

    if (dlgFile.ShowDialog() == System.Windows.Forms.DialogResult.OK)

        txtFilePath.Text = dlgFile.FileName;

}

Chúc các bạn học tốt.

Post a Comment

Mới hơn Cũ hơn