본문 바로가기

Database

[MSSQL] HashBYTES 함수를 이용한 암호화

안녕하세요 

마푸입니다. 


오늘은 결혼식을 다녀와서 몸이 많이 피곤하네요 ㅋ;


1일 1회 이상 블로그 포스트를 다짐한터라 포스트를 작성하러구 이것저것 뒤져봤는데 

마침 예전에 정리했던 자료 중에 재미 있는게 있어 옮겨 적어 보려합니다. 


MySQL에서는 password()라는 문자열 함수가 있습니다. 

단방향성 암호라서 보호화가 안되지요...


그러나 오픈소스의 한계로 암호화하는 방식이 공개되어있어서 디코딩이 가능합니다. 

(* 암호화 방식이 지금은 기억이 안나네요 ㅋ;; 한참 공부할때는 외웠었는데 ㅁ...ㅠ.ㅠ)

멍



어쨋든 MSSQL에도 이것과 비슷한 함수가 있습니다. hashbytes 함수인데요 

이것과 관련해서 예전에 정리한 글을 올려보겠습니다. 



 --     HashBYTES 함수를 이용한 암호화



 장점 :
 1. 암호화를 위해 키 또는 인증서가 필요하지 않는다.
 2. 복호화 방법이 제공되지 않는다 (단방향암호화)
 3. 암호화된 열에 인덱스를 생성해 성능 효과를 볼 수 있다.
 4. 위와 같은 차이점과 함께 사용하는 방법도 다소 차이가 있다.

HASHBYTES는 16진수로 변경하기 때문에 0x로 시작합니다. 
이부분을 제거 하기위해서는 CONVERT(VARCHAR,@VARBINARY,2)를 이용해서 앞부분을 제거 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use AdventureWorks2012
GO
 
-- 기존에 테이블이 있다면 삭제합니다.
IF OBJECT_ID ('dbo.EmpTest') is not null
                 DROP TABLE dbo.EmpTest
GO
 
-- 테이블 생성
SELECT BusinessEntityID, LoginID, JobTitle , BirthDate, HireDate, VacationHours
                 INTO dbo. EmpTest
                 FROM HumanResources. Employee
GO
 
-- 암호화에 사용될 열을 추가합니다.
 ALTER TABLE dbo. EmpTest ADD hashedLoginID varbinary(256 )
 GO
 
-- 새로운 열에 암호화 된 데이터를 저장합니다.
UPDATE dbo. EmpTest SET HashedLoginID = HASHBYTEs ('SHA1', LoginID)
GO
 
-- 암호화 대상 열 제거
ALTER TABLE dbo.EmpTest DROP COLUMN LoginID
GO
 
-- 데이터 확인
-- HASHBYTES는 VARBinary를 리턴하기 때문에 VARCHAR로 리턴하면 깨져보입니다. 
SELECT CONVERT (varchar, HashedLoginID) AS 'Decoding' ---> 헐 ;;; 완전 깨져보임
FROM dbo. EmpTest
 
-- 검색하기 (이게 머얏... 원래 값을 암호화해서 tur / false를 체크함 Mysql Password() 함수와 비슷하구먼....
SELECT BusinessEntityID, JobTitle, BirthDate , HireDate
FROM dbo. EmpTest
WHERE BusinessEntityID = 1 AND HashedLoginID = Hashbytes ('SHA1', N'adventure-works\ken0')
GO
 
 
-- 테이블 제거
DROP TABLE dbo.EmpTest 
cs


반응형