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[]
의 입력을 수행하므로 해시되기 전에 원본을 바이트 배열로 변환해야 할 수 있습니다. 문자열 값에 대한 해시를 만들려면 다음 단계를 수행합니다.
Visual Studio .NET 또는 Visual Studio를 엽니다.
Visual C# .NET 또는 Visual C#에서 새 콘솔 애플리케이션을 만들면 빈
Main()
메서드와 함께 공용 클래스가 만들어집니다.참고
Visual C#에서 NET, Class1.cs 기본적으로 만들어집니다. Visual C#에서 Program.cs 기본적으로 만들어집니다.
코드의
using
뒷부분System
에서 이러한 네임스페이스의 선언을 한정할 필요가 없도록 ,System.Security.Cryptography
및System.Text
네임스페이스에서 지시문을 사용합니다. 이러한 문은 다른 선언 앞에 사용해야 합니다.using System; using System.Security.Cryptography; using System.Text;
원본 데이터를 저장할 문자열 변수를 선언하고 소스 바이트 및 결과 해시 값을 저장할 두 개의 바이트 배열(정의되지 않은 크기)을 선언합니다.
string sSourceData; byte[] tmpSource; byte[] tmpHash;
클래스의 메서드를
GetBytes()
사용하여 소스 문자열을System.Text.ASCIIEncoding
바이트 배열로 변환합니다(해시 함수에 대한 입력으로 필요).sSourceData = "MySourceData"; //Create a byte array from source data. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData);
클래스의 instance 호출
ComputeHash
하여 원본 데이터에 대한 MD5 해시를 계산합니다MD5CryptoServiceProvider
.참고
다른 해시 값을 계산하려면 클래스의 다른 instance 만들어야 합니다.
//Compute hash based on source data. tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
이제 바이트 배열은
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(); }
코드를 저장한 다음 실행하여 소스 값에 대한 결과 16진수 문자열을 확인합니다.
두 해시 값 비교
원본 데이터에서 해시를 만드는 목적은 다음과 같습니다.
- 시간이 지남에 따라 데이터가 변경되었는지 확인하는 방법을 제공합니다.
- 실제 값으로 작업하지 않고 두 값을 비교합니다.
두 경우 모두 계산된 두 해시를 비교해야 합니다. 둘 다 16진수 문자열로 저장되는 경우(위 섹션의 마지막 단계에서와 같이) 쉽습니다. 그러나 둘 다 바이트 배열 형식일 수 있습니다. 이전 섹션에서 만든 코드에서 계속되는 다음 코드는 두 바이트 배열을 비교하는 방법을 보여 줍니다.
16진수 문자열 만들기 바로 아래에서 새 원본 데이터를 기반으로 새 해시 값을 만듭니다.
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();
프로젝트를 저장한 다음 실행하여 첫 번째 해시 값에서 만든 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을 참조하세요.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기