Visual C#을 사용하여 해시 값 계산 및 비교

이 단계별 문서에서는 해시 값을 가져오는 방법 및 두 해시 값을 비교하여 Visual C#을 사용하여 동일한지 여부를 검사 방법을 보여줍니다. 또한 이 작업을 수행하는 방법을 보여 주는 코드 샘플도 제공합니다.

원래 제품 버전: Visual C#
원래 KB 번호: 307020

요약

이 문서에서는 다음 Microsoft .NET Framework 클래스 라이브러리 네임스페이스를 참조합니다.

  • System.Security.Cryptography
  • System.Text

System.Security.Cryptography.NET Framework 클래스를 사용하면 원본 데이터에 대한 해시 값을 쉽게 계산할 수 있습니다.

해시 값 계산

네임스페이스에 포함된 System.Security.Cryptography 암호화 리소스를 사용하여 해시 값을 쉽게 생성하고 비교할 수 있습니다. 모든 해시 함수는 형식 Byte[]의 입력을 수행하므로 해시되기 전에 원본을 바이트 배열로 변환해야 할 수 있습니다. 문자열 값에 대한 해시를 만들려면 다음 단계를 수행합니다.

  1. Visual Studio .NET 또는 Visual Studio를 엽니다.

  2. Visual C# .NET 또는 Visual C#에서 새 콘솔 애플리케이션을 만들면 빈 Main() 메서드와 함께 공용 클래스가 만들어집니다.

    참고

    Visual C#에서 NET, Class1.cs 기본적으로 만들어집니다. Visual C#에서 Program.cs 기본적으로 만들어집니다.

  3. 코드의 using 뒷부분 System에서 이러한 네임스페이스의 선언을 한정할 필요가 없도록 , System.Security.CryptographySystem.Text 네임스페이스에서 지시문을 사용합니다. 이러한 문은 다른 선언 앞에 사용해야 합니다.

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
  4. 원본 데이터를 저장할 문자열 변수를 선언하고 소스 바이트 및 결과 해시 값을 저장할 두 개의 바이트 배열(정의되지 않은 크기)을 선언합니다.

    string sSourceData;
    byte[] tmpSource;
    byte[] tmpHash;
    
  5. 클래스의 메서드를 GetBytes() 사용하여 소스 문자열을 System.Text.ASCIIEncoding 바이트 배열로 변환합니다(해시 함수에 대한 입력으로 필요).

    sSourceData = "MySourceData";
    //Create a byte array from source data.
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    
  6. 클래스의 instance 호출 ComputeHash 하여 원본 데이터에 대한 MD5 해시를 계산합니다MD5CryptoServiceProvider.

    참고

    다른 해시 값을 계산하려면 클래스의 다른 instance 만들어야 합니다.

    //Compute hash based on source data.
    tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  7. 이제 바이트 배열은 tmpHash 원본 데이터에 대해 계산된 해시 값(128비트 값=16바이트)을 보유합니다. 다음과 같은 값을 다음 코드에서 수행하는 16진수 문자열로 표시하거나 저장하는 것이 유용한 경우가 많습니다.

    Console.WriteLine(ByteArrayToString(tmpHash));
    static string ByteArrayToString(byte[] arrInput)
    {
        int i;
        StringBuilder sOutput = new StringBuilder(arrInput.Length);
        for (i=0;i < arrInput.Length; i++)
        {
            sOutput.Append(arrInput[i].ToString("X2"));
        }
        return sOutput.ToString();
    }
    
  8. 코드를 저장한 다음 실행하여 소스 값에 대한 결과 16진수 문자열을 확인합니다.

두 해시 값 비교

원본 데이터에서 해시를 만드는 목적은 다음과 같습니다.

  • 시간이 지남에 따라 데이터가 변경되었는지 확인하는 방법을 제공합니다.
  • 실제 값으로 작업하지 않고 두 값을 비교합니다.

두 경우 모두 계산된 두 해시를 비교해야 합니다. 둘 다 16진수 문자열로 저장되는 경우(위 섹션의 마지막 단계에서와 같이) 쉽습니다. 그러나 둘 다 바이트 배열 형식일 수 있습니다. 이전 섹션에서 만든 코드에서 계속되는 다음 코드는 두 바이트 배열을 비교하는 방법을 보여 줍니다.

  1. 16진수 문자열 만들기 바로 아래에서 새 원본 데이터를 기반으로 새 해시 값을 만듭니다.

    sSourceData = "NotMySourceData";
    tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
    byte[] tmpNewHash;
    tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
    
  2. 두 바이트 배열을 비교하는 가장 간단한 방법은 배열을 반복하여 각 개별 요소를 두 번째 값의 해당 요소와 비교하는 것입니다. 요소가 다르거나 두 배열의 크기가 같지 않으면 두 값이 같지 않습니다.

    bool bEqual = false;
    if (tmpNewHash.Length == tmpHash.Length)
    {
        int i=0;
        while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i]))
        {
            i += 1;
        }
        if (i == tmpNewHash.Length)
        {
            bEqual = true;
        }
    }
    
    if (bEqual)
        Console.WriteLine("The two hash values are the same");
    else
        Console.WriteLine("The two hash values are not the same");
    Console.ReadLine();
    
  3. 프로젝트를 저장한 다음 실행하여 첫 번째 해시 값에서 만든 16진수 문자열을 봅니다. 새 해시가 원래 해시와 같은지 확인합니다.

전체 코드 목록

using System;
using System.Security.Cryptography;
using System.Text;

namespace ComputeAHash_csharp
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static void Main(string[] args)
        {
            string sSourceData;
            byte[] tmpSource;
            byte[] tmpHash;
            sSourceData = "MySourceData";
            //Create a byte array from source data
            tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);

            //Compute hash based on source data
            tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
            Console.WriteLine(ByteArrayToString(tmpHash));

            sSourceData = "NotMySourceData";
            tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);

            byte[] tmpNewHash;

            tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);

            bool bEqual = false;
            if (tmpNewHash.Length == tmpHash.Length)
            {
                int i=0;
                while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i]))
                {
                    i += 1;
                }
                if (i == tmpNewHash.Length)
                {
                    bEqual = true;
                }
            }

            if (bEqual)
                Console.WriteLine("The two hash values are the same");
            else
                Console.WriteLine("The two hash values are not the same");
            Console.ReadLine();
        }

        static string ByteArrayToString(byte[] arrInput)
        {
            int i;
            StringBuilder sOutput = new StringBuilder(arrInput.Length);
            for (i=0;i < arrInput.Length -1; i++)
            {
                sOutput.Append(arrInput[i].ToString("X2"));
            }
            return sOutput.ToString();
        }
    }
}

참조

.NET Framework 암호화 기능을 사용하는 방법에 대한 자세한 내용은 .NET을 참조하세요.