Thứ Ba, 11 tháng 6, 2013

Tìm hiểu về mã hóa MD5 Full

  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.
mahoamd5
  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.


MỘT SỐ THÔNG TIN CĂN BẢN:
MD5 LÀ GÌ ?
MD để chỉ cho “message digest” (Lấy 2 chử đầu). MD5 là một thuật tóan lấy một tín hiệu vào có chiều dài bất kỳ và đưa ra một tín hiệu digest có chiều dài cố định (128-bit, 32 ký tự hexa), được làm ra từ 1 giá trị hexa (chú ý : mỗi ký tự hex là 4 bit, do đó 128bit là 32 ký tự hex). OK, bây giờ nói rõ hơn một chút : MD5 là cách căn bản để lấy chùm ký tự ( là digits, alphabeic hay gì khác ), được gọi là string nhập vào, và thay đổi chúng thành một chùm ký tự dài 32 ký tự , được gọi là tín hiệu digest (message digest) hay hashes của string được nhập vào, chuổi 32 ký tự này được tạo ra từ các ký tự hexa ( những digits: 0-9 và các chử a-f). Điều này có nghĩa là, với một string nhập vào có chiều dài bất kỳ , MD5 sẽ luôn luôn cài đặt “một vài thứ” để thành một chuổi string dài 32 ký tự, mà các ký tự là các ký tự hexa. Tín hiệu digest sẽ ko có khỏang trống, hay dấu hoặc kép hay bất cứ thứ gì khác 0-9 và a-f trong tín hiệu hashes được xuất ra.
MD5 hashes có tiện dụng là những hashes tạo ra trông khác nhau hòan tòan từ những tín hiệu nhập vào hơi hơi giống nhau. Ví dụ sau sẽ làm rỏ hơn về điều này:
• The MD5 hash of jim is 5e027396789a18c37aeda616e3d7991b
• The MD5 hash of Jim is d54b3c8fcd5ba07e47b400e69a287966
• The MD5 hash of Jimmy is 495b3121d23f5988b133882b36aa7214
Như bạn thấy đó, có ba tín hiệu nhập vào “hơi hơi giống nhau” nhưng các tín hiệu MD5 hashes xuất ra hòan tòan khác nhau. Ví dụ này cũng chứng minh hai ký tự j và J là 2 ký tự khác nhau . Do đó chúng ta thấy “máy đẻ” ra MD5 hashes là lọai rất nhạy cảm. Ở đây cần chú ý thêm là trong ví dụ thứ 3 chỉ thêm vào 2 ký tự (my) ở cuối chuổi của ví dụ 2 , và hashes của nó đã thay đổi hòan tòan. Vì vậy chúng ta ko thể có hashes của chuổi “Blehlo” từ hashes của chuổi “Bleh” bằng cách “vá viếu” thêm vài ký tự - thay đổi trong chuổi string nhập vào thì tín hiệu hashes của nó cũng sẽ thay đổi hòan tòan. Và ở đây cũng nên chú ý với 3 string nhập vào có chiều dài ko giống nhau nhưng các hash sinh ra đều có chiều dài là 32 ký tự (bao gồm các số 0-9 và a-f), ở ví dụ sau cùng ta cũng thấy chuổi string nhập vào dài hơn 2 ký tự so với 2 string trước nhưng chuổi hash của nó cũng chỉ có 32 ký tự chử số hex.
Mặc dù tín hiệu MD5 hashes xuất ra ngẫu nhiên từ string nhập vào , nhưng thật ra chúng ta có một kiểu mẫu tạo hashes MD5(một thuật tóan MD5) được sử dụng để “quay” string nhập vào thành một md hay một hashes. Nếu bạn muốn sử dụng nó thì bạn có thể đọc ở tut này ở phần sau . Bởi vì MD5 được sử dụng một thuật tóan giống nhau cho mỗi lần tính tóan nên MD5 hashes của chuổi jim luôn luôn l�
5e027396789a18c37aeda616e3d7991b
Trong thực tế , một số chương trình còn thêm vào một vào vài lọai thuật tóan khác khi md được sinh ra , làm cho MD5 cực kỳ thông dụng và là 1 công cụ rất mạnh. Nhưng có lẻ điều quan trọng nhất là trong thực tế MD5 được dùng như một cách tạo hashes hay ta gọi là hash chuổi ( biến chuổi thành 1 chuổi “vớ vẫn” nào đó)……
Tôi xin nói thật, những điều tui tìm hiểu được trên đây làm cho tui vô cùng “đắc ý”. Tóm lại chúng ta cần biết như sau:
-MD5: là một thuật tóan biến đổi 1 chuổi string thành 1 tín hiệu “message digest” hay còn gọi là “MD5 hashes”. Đó là một tín hiệu 128 bits – 32 ký tự hexa.
-hash một chuổi string là biến một string thành một tín hiệu message digest
-Thủ tục (procedure) hay hàm (function) trong chương trình để hash chuổi gọi là “máy sinh” MD5 hashes hay còn gọi nôm na là “máy hash”.
Bây giờ chúng ta sẽ bước sang một câu hỏi khác rất quan trọng.
CHÚNG TA “DỊCH NGƯỢC” LẠI MỘT TÍN HIỆU MD5 HASHES NHƯ THẾ NÀO ?
Như trên tui đã nói : từ 1 hashes ta tìm ngược lại string của nó được ko? Điều này ko bao giờ làm được. Ko một “máy” nào làm được.


Vậy ở đây câu trả lời là : “Bạn không thể” . Cách hash một string có nghĩa là tín hiệu md xuất ra bằng thuật tóan MD5 là ko thể đảo ngược. Không thể biết cách tìm ra chuổi origin từ tín hiệu MD5 hashes. Vì như ví dụ ở phần trước, những chuỗi có vẽ giống nhau nhưng tín hiệu md sinh ra hòan tòan khác nhau Tức là chúng ta ko thể nào “decode” (dịch ngược) được một chuổi MD5 hashes. Chỉ có một cách có được chuổi origin là bằng cách “brute force cracking”. Tức là phải duyệt qua rất nhiều tổ họp các ký tự của chuổi vào cho đến khi một trong những chuổi md được tạo ra của chúng bằng với chuổi md cần tìm origin. Tuy nhiên , với khả năng máy tính thời nay muốn làm điều này phải mất rất nhiều năm. Mặt khác ở đây chúng ta cần chú ý đó là tín hiệu MD5 hashes được thiết kế ra là “độc nhất vô nhị”. Trên lý thuyết cũng có khả năng 2 chuổi khác nhau có tín hiệu md giống nhau nhưng khả năng này rất rất nhỏ (1/(16^32) hay vào khỏang (3.4E+38). Bởi vậy có một lần tui tham gia forum HVA và có người sử dụng chương trình tìm password cho tập tin WINRAR bị mất password và bác Comp đã kiến nghị ko nên dùng chương trình đó là lý do trên. Vì khả năng tìm ra password rất “dài hơi” và máy tính chắc chạy vài tuần của chưa tìm ra. Hảy bỏ ý định đó đi các bạn.


MD5 ĐƯỢC SỬ DỤNG CHO VIỆC GÌ ?
Chính các đặc điểm của MD5 làm cho nó thường được ứng dụng trong một số trường hợp như sau:
-Nó thường được dùng để checksum tòan bộ file. Các nhà phát triển ứng dụng thường dùng MD5 trong việc cho phép download file trên NET. Họ sẽ cho “xuất bản” một tín hiệu md của file download. Khi chúng ta tải file về , thì file chúng ta vừa download sẽ có một tín hiệu md, nếu tín hiệu này khớp với tín hiệu các nhà phát triển ứng dụng đã “xuất bản” ở trên. Thì OK, ko có vấn đề. Nếu hai tín hiệu md này khác nhau, có thể có trong file download có virut hay cái gì đó tương tự.
-Một ứng dụng thường được dùng nữa là hash một password. Được dùng cho việc bảo mật một ứng dụng, hay những gì tương tự …v….v….
Đây là một số thông tin căn bản chúng ta cần biết qua khi bắt đầu tìm hiểu về thuật tóan MD5. Ở đây tui cần nói thêm một chút:


-Chúng ta chỉ có thể tạo ra tín hiệu message digest từ một chuổi string ( đây được gọi là quá trình “encode”).Chúng ta ko thể “dịch ngược” một message digest ra một string origin (quá trình “dịch ngược” gọi là “decode”). Khi tìm hiểu về MD5, tui có hỏi trên Forum HVA về các soft dùng MD5, và có một người trả lời là “bạn cần soft encode hay decode”. Và hacnho trả lời giúp tui : dĩ nhiên là encode. Thật tình tui ko thể nào chịu nổi lọai người này. Họ chỉ biết trình diễn kiến thức. Đây ko phải là “văn hóa” khi tham gia một forum. Mong mọi người nên chân thành với nhau nhiều hơn.


-Một số người sai lầm khi hiểu rằng “MD5 hashes “ là thuật tóan tựa như MD5 ,tức là thuật tóan trên nền tản MD5 biến đổi đi đôi chút. (Các thuật tóan này tôi gọi nôn na là thuật tóan “Lai căn MD5”). Điều này sai lầm , benina chỉ xin nhắc lại : MD5 hashes = message digest.


-Đứng về mặt cracking, một số người khi chưa tìm hiểu kỹ MD5 và thấy decode ko được nên cho rằng các soft dùng thuật tóan MD5 là ko keygen được “bất khả xâm phạm” . Lại thêm một sai lầm nữa. Vì sau vậy?. Vì nếu 1 soft được bảo vệ bằng đúng “chính xác thuật tóan MD5” thì quá dễ để tìm ra số serial vì chúng ta đã biết chính xác thuật tóan này diễn ra như thế nào. Vì vậy các soft chỉ dùng thuật tóan “lai căn MD5” , hay lồng các thuật tóan khác với thuật tóan MD5. Vì vậy các bạn muốn tìm các soft trong thực tế sử dụng MD5 rất khó. (có thể nói là ko có vì ko coder nào ngu đến như vậy!). Tui chỉ tìm được một soft có thuật tóan khá giống thuật tóan MD5 mà thôi. Thực ra tui tìm trên Net thấy có 2 soft có thuật tóan “sát” với MD5, nhưng ko còn đường download trên Net nữa vì quá cũ. Tui phải ra tiệm bán các đĩa CD, và tìm được 1 Soft (mô phật! hên thiệt). Trong quá trình tìm hiểu MD5, tui cũng thu thập được một số soft có thuật tóan “Lai căn MD5”.Rồi VNIT sẽ share cho các bạn.

1 nhận xét:

  1. anh có thể cho e xin source code của mã hóa md5 k a, em mã hóa chuỗi md5 được rồi nhưng mã hóa tập tin thì chưa đc

    Trả lờiXóa