상세 컨텐츠

본문 제목

해시 함수 (HASH)로 데이터 무결성 검증하기

Db2 for i

by 아이구르미 2022. 12. 27. 13:00

본문

이번에는 데이터나 파일의 무결성을 검증할 때 유용한 단방향 암호화 함수 HASH 함수에 대해서 알아보겠습니다!!

이 함수는 Db2 for i 7.4에 추가된 함수들입니다. 

먼저 HASH 함수가 무엇인지부터 살펴볼까요?

 

해시 함수(HASH) 란? 

해시 함수(HASH)는 임의의 길이를 갖는 임의의 데이터를 고정된 길이의 데이터로 매핑하는 단방향 함수를 말합니다. 

이러한 해시 함수를 적용하여 나온 고정된 길이의 값을 해시값, 해시 코드 해시섬(sum), 체크섬(checksum) 등으로 부릅니다.

해시값만 가지고는 원문을 복원해내는 것은 불가능합니다. 따라서 민감한 입력 데이터나 파일의 무결성을 검증할 때 사용합니다. 파일/데이터를 배포할 때 해시값을 같이 배포하고, 파일/데이터의 해시값이 배포된 해시값과 같으면 파일/데이터가 변조되지 않았다는 것을 확인할 수 있습니다. 소프트웨어의 코드서명이나 인터넷에서 다운로드한 파일을 검증하는 데 쓰입니다. 

 

해시 함수 (HASH) 종류

사용되는 해시 알고리즘에 따라 구분되며, Db2 for i에서 지원 가능한 해시 함수는 총 4개가 있습니다. 

함수 이름 해시 알고리즘 결과값 크기 가능한 결과값
최대 개수
결과값 길이 Algorithm Value
HASH_MD5 MD5 128 bit
16 0
HASH_SHA1 SHA1 160 bit
20 1
HASH_SHA256 SHA256 256 bit
32 2
HASH_SHA512 SHA512 512 bit
64 3

* 함수의 입력값은 특정 컬럼/필드나 상수값입니다. 

* 함수의 결과값의 데이터 타입은 BINARY 입니다.

* 입력값이 NULL 이면, 함수의 결과값도 NULL 이 됩니다.

 

추가로 데이터베이스 테이블의 로우(ROW)/레코드(RECORD) 전체값에 대해 SHA-512 해시 알고리즘을 적용하여 해시값을 생성하는 함수가 있습니다. 

함수 이름 : HASH_ROW

함수 이름 해시 알고리즘 결과값 크기 가능한 결과값
최대 개수
결과값 길이
HASH_ROW SHA512 512 bit
64

* 함수의 입력값은 테이블입니다.

* 함수의 결과값의 데이터 타입은 BINARY 입니다.

 

해시 함수 (HASH) 사용법

1) SHA-256 알고리즘을 사용하여 입력값 ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ'의 해시값을 생성합니다. 

VALUES HEX(HASH_SHA256('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))

이 SQL 의 결과는 아래와 같이 나올 것입니다.

011F7AD1ECD8E5A4CC8533D1ECD497DC5D95E848B14F8BCFD56A73D7F41843E2

 

 

2) SHA-512 알고리즘을 사용하여 동일한 입력값인 ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ'의 해시값을 생성합니다.

VALUES HEX(HASH_SHA512('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))

이 SQL의 결과는 아래와 같이 나올 것입니다. 

D8AC4B838921A83C4207B62B8B63628F8FBE836EB012167310331FFC070FC977D224F39148
  8806CB1FE2AA9C8C739E5104CAD1C4C6E97967DA6223D657CD9295

 

3) SHA-512 알고리즘을 사용하여 2개의 테이블의 레코드가 서로 다른 값이 있는지 확인하여, 레코드 값이 다른 경우 해당 레코드의 아이디를 보여줍니다. 

WITH LIB1_HASH AS (
    SELECT EMPNO, HASH_ROW(E1) ROW_VALUE, RID(E1) ROW_RID
         FROM LIB1.EMPLOYEE E1),
 LIB2_HASH AS (
    SELECT EMPNO, HASH_ROW(E2) ROW_VALUE, RID(E2) ROW_RID
         FROM LIB2.EMPLOYEE E2)
SELECT H1.EMPNO, H1.ROW_RID, H2.ROW_RID 
         FROM LIB1_HASH H1 FULL OUTER JOIN LIB2_HASH H2
               ON H1.EMPNO = H2.EMPNO
         WHERE H1.ROW_VALUE <> H2.ROW_VALUE;

이 SQL의 예시 결과값은 다음과 같습니다. EMPNO 가 000010 인 레코드가 서로 다른 값을 가지고 있으며, LIB1에 있는 EMPLOYEE 테이블의 ROW ID는 1, LIB2에 있는 EMPLOYEE 테이블의 ROW ID도 1로 확인되었습니다. 

EMPNO		ROW_RID		ROW_RID
000010		1		1

 

관련글 더보기

댓글 영역