+2

MD5, SHA và SM3 là các thuật toán mã hóa một chiều phổ biến

MD5, SHA và SM3 là các thuật toán mã hóa một chiều phổ biến

Thuật toán mã hóa một chiều (one-way encryption algorithm) là một thuật toán mã hóa dữ liệu mà nó chỉ có thể được thực hiện theo một hướng duy nhất - từ dữ liệu gốc sang dữ liệu đã được mã hóa. Nghĩa là, không thể dễ dàng giải mã dữ liệu đã được mã hóa để khôi phục lại dữ liệu gốc từ nó.

Thuật toán mã hóa một chiều là hàm băm (hash function).

Thông thường hàm băm thường được sử dụng để lưu giá trị băm của mật khẩu thay vì lưu trữ mật khẩu trực tiếp.
Khi người dùng nhập mật khẩu, hệ thống chỉ cần so sánh giá trị băm của mật khẩu đã nhập với giá trị băm đã lưu trước đó.

Tại đây sẽ không đề cập đến nguyên lý hoạt động của MD5, SHA và SM3 mà sẽ chủ yếu về các khái niệm, sử dụng thuật toán.
Nguyên lý hoạt động và chi tiết MD5, SHA và SM3 có trong tài liệu sau, mọi người có thể tham khảo :
https://github.com/odzhan/tinycrypt/tree/master/hash

1 . MD5

MD5 là viết tắt của "Message Digest Algorithm 5", là một thuật toán băm tiêu chuẩn được thiết kế để tạo ra một giá trị băm (hash value) có độ dài cố định từ một đoạn dữ liệu có độ dài bất kỳ. Giá trị băm được tạo ra thông qua MD5 thường là một chuỗi hex (hệ thập lục phân) có độ dài 32 ký tự (128 bit).
MD5 được Ronald Rivest thiết kế vào năm 1991 và đã trở thành thuật toán băm phổ biến nhất trong những năm đầu tiên của internet.
Trong thời gian gần đây, nhiều cuộc tấn công collision (xung đột) đã được thực hiện thành công trên MD5 và nó không còn được khuyến cáo sử dụng trong các hệ thống yêu cầu tính bảo mật cao.

1.1. Sử dụng trong các ngôn ngữ

  • MD5 trong C#
    // bổ sung thêm thư viện 
    using System.Security.Cryptography;

    public static string GenerateMD5(string data)
    {
       //tạo mới đối tượng lưu chuỗi kết quả 
       StringBuilder hash = new StringBuilder();
       //tạo mới đối tượng mã hóa md5
       MD5CryptoServiceProvider md5provider = new MD5CryptoServiceProvider();
       //mã hóa
       byte[] bytes = md5provider.ComputeHash(new UTF8Encoding().GetBytes(data));
       //duyệt từng byte chuyển sang hệ 16
       for (int i = 0; i < bytes.Length; i++)
       {
           //chuyển về hệ hexa (16) chữ thường nếu muốn chữ hoa thì X2 nhé
           hash.Append(bytes[i].ToString("x2"));
       }
       return hash.ToString();
   }
  • MD5 trong JavaScript
<!--Sử dụng thư viện md5-->
   // C1: 2 thư viện cũ riêng lẻ
   <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/core.min.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/md5.js"></script>

   // C2: thư viện mới nhất đã tích hợp core.min.js và md5.js
   <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>
   
   // có thể dùng 1 trong 2 cách trên
   <script>

       //gọi hàm MD5 và thông báo kết quả

       alert(CryptoJS.MD5('12345678'))

   </script>

1.2. Sử dụng trong các hệ quản trị cơ sở dữ liệu

  • MD5 trong SQL Server
//gọi hàm có sẵn trong SQL Server
select lower(CONVERT(VARCHAR(32), HashBytes('md5', '12345678'), 2))

MD5 trong MySQL
//Gọi hàm có sẵn trong MySQL
select MD5('12345678')

2.SHA

SHA là viết tắt của "Secure Hash Algorithm" là một loạt các thuật toán băm được thiết kế để tạo ra giá trị băm (hash value) có độ dài cố định từ một đoạn dữ liệu có độ dài bất kỳ. Các thuật toán trong loạt SHA thường được sử dụng trong nhiều ứng dụng bảo mật thường là 256 hoặc 512 bit.

Các phiên bản của SHA bao gồm:

SHA-1 : Tạo ra một giá trị băm 160-bit (20 byte). SHA-1 đã bị coi là không an toàn do các lỗ hổng bảo mật, đặc biệt là khả năng tấn công collision (xung đột).
Năm 2017, một nhóm các nhà nghiên cứu đã công bố một cuộc tấn công va chạm SHA-1 trong vòng 26 giây.
https://whitehat.vn/threads/thuat-toan-sha-1-da-bi-pha-vo.8283/#:~:text=Qua nghiên cứu trên có,-256%2C SHA-3.

SHA-2 : Nhiều biến thể với độ dài khác nhau của giá trị băm, bao gồm SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 và SHA-512/256.
SHA-256 và SHA-512 là hai biến thể phổ biến nhất và an toàn nhất trong loạt SHA-2. Độ dài của giá trị băm là 256 bit và 512 bit tương ứng.

SHA-3 : Thiết kế bởi Keccak Team được chọn làm tiêu chuẩn SHA bởi NIST (National Institute of Standards and Technology).
Một cấu trúc khác với SHA-2 và có độ dài của giá trị băm có thể được lựa chọn.Có độ an toàn cao hơn các thuật toán băm SHA-1 và SHA-2.
Nó đã được chứng minh là có khả năng chống lại các cuộc tấn công khác nhau, bao gồm tấn công brute force, tấn công chèn, tấn công thay thế và tấn công nối.

2.1. Sử dụng trong các ngôn ngữ

  • SHA-256 và SHA-512 trong C#
  // bổ sung thêm thư viện 
  using System.Security.Cryptography;

  // SHA-256
   public static string ComputeSHA256Hash(string input)
   {
       using (SHA256 sha256 = SHA256.Create())
       {
           byte[] inputBytes = Encoding.UTF8.GetBytes(input);
           byte[] hashBytes = sha256.ComputeHash(inputBytes);

           StringBuilder builder = new StringBuilder();
           for (int i = 0; i < hashBytes.Length; i++)
           {
               builder.Append(hashBytes[i].ToString("x2"));
           }

           return builder.ToString();
       }
   }

  // SHA-512 
   public static string ComputeSHA512Hash(string input)
   {
       using (SHA512 sha512 = SHA512.Create())
       {
           byte[] inputBytes = Encoding.UTF8.GetBytes(input);
           byte[] hashBytes = sha512.ComputeHash(inputBytes);

           StringBuilder builder = new StringBuilder();
           for (int i = 0; i < hashBytes.Length; i++)
           {
               builder.Append(hashBytes[i].ToString("x2"));
           }

           return builder.ToString();
       }
   }
  • SHA-256 và SHA-512 trong JavaScript
// sha :'SHA-256' or 'SHA-512'
async function computeSHAHash(input, sha) {
   const encoder = new TextEncoder();
   const data = encoder.encode(input);

   const hashBuffer = await crypto.subtle.digest(sha, data);
   const hashArray = Array.from(new Uint8Array(hashBuffer));
   const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join('');

   return hashHex;
}

2.2. Sử dụng trong các hệ quản trị cơ sở dữ liệu

  • SHA-256 và SHA-512 trong SQL Server
-- SHA-256 và SHA-512 SQL Server
DECLARE @Message NVARCHAR(MAX) = '12345678';
DECLARE @SHA NVARCHAR(50) = 'SHA2_512' ; -- lựa chọn 1 trong 2 SHA_256, SHA_512
DECLARE @Hash VARBINARY(128);

-- Hash mes và biến thể mới nhau
SET @Hash = HASHBYTES(CAST(@SHA AS NVARCHAR(50)), CAST(@Message AS NVARCHAR(MAX)));

-- Hiển thị biểu diễn thập lục phân của hàm băm
SELECT CONVERT(VARCHAR(MAX), @Hash, 2) AS SHA;
  • SHA-256 và SHA-512 trong MySQL
SET @Message = '12345678';
SET @Sha = '512'; -- lựa chọn 1 trong 2 (256,512)

-- sử dụng hàm SHA2 vì SHA-256 và SHA-512 đều thuộc phiên bản SHA-2 
SELECT SHA2(@Message, @Sha) AS SHAHash;

3.SM3

SM3 viết tắt của "Secure Hash Algorithm 3" là một thuật toán băm mật mã được phát triển của Tàu Khựu vào năm 2008. Nó là một thuật toán băm 512 bit dựa trên thuật toán MD4 và có độ an toàn cao và hiệu suất tốt.
Có khả năng chống lại các cuộc tấn công khác nhau như brute force, chèn, thay thế và nối.
SM3 có cấu trúc Merkle-Damgard và tương tự SHA-2 thuộc dòng MD4, với việc bổ sung một số tính năng tăng cường bao gồm chức năng bước phức tạp hơn và sự phụ thuộc vào thông điệp mạnh hơn SHA-256 [ SM3-Details ].
Giá trị băm đầu ra dài 256 bit, dựa trên 512-bit khối thông báo đầu vào, với độ dài đầu vào lên tới 2^(m)

3.1. Sử dụng trong các ngôn ngữ

  • SM3 trong C#
  // bổ sung thêm thư viện Install-Package SM3.NET
  using SM3;

  public static string ComputeSM3Hash(string input)
   {
   byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input);

       // Tính toán giá trị hash SM3
       byte[] hashValue = SM3CryptoServiceProvider.ComputeHash(inputBytes);

       return BitConverter.ToString(hashValue).Replace("-", "").ToLower();
   }
  • SM3 trong JavaScript
// sử dụng thư viện jsrsasign 
// npm install jsrsasign
const KJUR = require('jsrsasign');

// Chuyển đổi dữ liệu sang dạng byte array
const dataBytes = new TextEncoder().encode('12345678');

// Tính toán giá trị hash SM3
const hashValue = KJUR.crypto.Util.hashHex(dataBytes, 'sm3');

// In ra giá trị hash dưới dạng hex
console.log('SM3 Hash: ' + hashValue);

3.2. Sử dụng trong các hệ quản trị cơ sở dữ liệu

  • SQL Server và MySQL không hỗ trợ cho SM3

4. Tổng kết

Tóm lại, qua đây mình đã giới thiệu và cách sử dụng các hàm băm MD5, SHA và SM3 phổ biến hiện nay. Hy vọng, qua bài viết trên, các bạn sẽ nắm được thông tin bổ ích này. Nếu thấy có sai sót hay có hàm băm nào thấy hay có thể đóng góp dưới phần Bình luận mình xin tiếp thu các ý kiến của mọi người đóng góp
Tại phần sau mình sẽ nói 3DES: Gấp 3 lần DES hay gấp ba lần an toàn?
Cảm ơn các bạn đã theo dõi bài viết của mình và mong rằng các bạn sẽ tiếp tục ủng hộ những bài viết tiếp theo của mình nhé!

Nguồn tham khảo :

https://github.com/odzhan/tinycrypt/tree/master/hash
https://hanam88.com/kho-tai-lieu/63/102/su-dung-giai-thuat-md5-trong-cac-ngon-ngu-lap-trinh-va-cac-he-quan-tri-co-so-du-lieu-khac-nhau-.html
https://whitehat.vn/threads/thuat-toan-sha-1-da-bi-pha-vo.8283/#:~:text=Qua nghiên cứu trên có,-256%2C SHA-3.
https://datatracker.ietf.org/doc/html/draft-sca-cfrg-sm3-02


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí