해시(Hash)와 해시 함수의 의미

in #kr7 years ago (edited)

사전적 의미

해시의 사전적 의미는 고기와 감자를 잘게 다져 섞어 요리한 것 입니다.

컴퓨터 공학적 의미

해시 함수는 임의의 길이의 값을 입력받아 고정된 길이의 결과 값을 출력하는 함수입니다. 해시 함수에 의해 얻어지는 값을 해시 이라 하고 간단하게 해시라고 합니다.  

예를 들어, 해시 함수에 "망고주스"라는 값을 입력하면 다음과 같은 해시 값을 얻을 수 있습니다. 

HhXrhTV+Tl05pe/kQgTFPA8eMWe+SYJ0v9KwGJvKios=

해시의 특징

해시 함수는 같은 값을 입력하면 항상 같은 값을 얻을 수 있습니다. 따라서 두 해시 값이 다르다면 입력 값도 다르다는 것을 의미합니다. 이는 데이터의 오류나 변조를 탐지 할 수 있기에 무결성 검사에 사용됩니다.   

하지만 해시 값이 같다고 해서 입력 값이 같다는 것을 보장해 주지 않습니다. 해시 함수가 서로 다른 두 개의 입력값에 대해 동일한 출력값을 내는 상황이 발생하기 때문이죠. 이를 해시 충돌이라 합니다.   

해시 함수는 해시 값만으로는 원래 입력 값을 알아내기 힘들다는 사실에 의해 암호화에 사용되기도 합니다.   

또한 키 값을 사용하면 같은 값을 입력해도 다른 값을 얻을 수 있습니다. 이를 이용해 전자서명이나 암호화에 사용됩니다.   

샘플코드

값 입력 및 해시 값 얻기

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

class Program
{
	static void Main(string[] args)
	{
		string MessageString = "망고주스";

		// UnicodeEncoding 인스턴스 생성.
		UnicodeEncoding UE = new UnicodeEncoding();

		// 문자열을 바이트 배열로 변환.
		byte[] MessageBytes = UE.GetBytes(MessageString);

		// SHA1Managed 인스턴스 생성.
		SHA256Managed SHhash = new SHA256Managed();

		// 바이트 배열에서 해시 값 생성.
		byte[] HashValue = SHhash.ComputeHash(MessageBytes);

		// 해시값 출력.
		Console.Write(Convert.ToBase64String(HashValue));
	}
}

결과 출력

HhXrhTV+Tl05pe/kQgTFPA8eMWe+SYJ0v9KwGJvKios=

해시 값 검증

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

class Program
{
	static void Main()
	{
		// "This is the original message!"에서 생성된 해시값.
		string SentHashValue = "HhXrhTV+Tl05pe/kQgTFPA8eMWe+SYJ0v9KwGJvKios=";

		// 해시 값과 비교할 문자열.
		string MessageString = "망고주스";

		// UnicodeEncoding 인스턴스 생성.
		UnicodeEncoding UE = new UnicodeEncoding();

		// 문자열을 바이트 배열로 변환.
		byte[] MessageBytes = UE.GetBytes(MessageString);

		// SHA1Managed 인스턴스 생성.
		SHA256Managed SHhash = new SHA256Managed();

		// 바이트 배열에서 해시 값 생성.
		byte[] CompareHashValue = SHhash.ComputeHash(MessageBytes);

		string CompareHashString = Convert.ToBase64String(CompareHashValue);

		// 해시값과 같은지 출력.
		if (SentHashValue.Equals(CompareHashString))
		{
			Console.WriteLine("The hash codes match.");
		}
		else
		{
			Console.WriteLine("The hash codes do not match.");
		}
	}
}

결과 출력

입력 값이 같을 경우
The hash codes match.
입력 값이 틀릴 경우
The hash codes do not match.

해시에 대하여 알아보았습니다.

해시는 정말 다양한 분야에서 사용되는 기술 입니다.

특히 블록체인 관련 글에서 해시라는 말을 많이 접하게 되는데요. 조금이라도 참고가 되고자 포스팅 합니다.

그럼 다음 포스트에서 뵙겠습니다.

Sort:  

좋은글인거같은데 아무것도 모르는제가 보기에는 어렵네요ㅠㅠ

그런가요? 다음에는 좀 더 쉬운 주제를 골라 보겠습니다.

모래요정 바람돌이가 하루에 한가지 소원만을 들어주는것처럼
짱짱맨도 1일 1회 보팅을 최선으로 합니다.
부타케어~ 1일 1회~~
너무 밀려서 바쁩니다!!

감사합니다.

음 그럼 암호화할때는 암호화키값과 해쉬값 이 2개가 필요한건가요??

단순히 암호화를 위해서는 입력값 1개만 필요합니다.
하지만 전자서명 처럼 사용자마다 다른 해시값이 필요하다면 입력값과 개인키 값 2개가 필요합니다.

Coin Marketplace

STEEM 0.16
TRX 0.15
JST 0.028
BTC 57975.44
ETH 2289.64
USDT 1.00
SBD 2.46