본문 바로가기
개발/Database

SQL Server : 데이터의 암호화와 복호화

by ispie 2019. 1. 28.

SQL Server에서 데이터의 암호화와 복호화에 대해서 검증한 내용을 정리해 보았습니다.

 

0. 전제조건

  • 대상의 SQL Server은 최신 버젼은 아님. 당시 기준 10여년 이상 된 낡은 버젼의 SQL Server 였음.
  • DB단위의 인증이라거나 키는 가급적 사용하지 않고 어플 단위로 암호화와 복호화를 하고 싶음.
  • 개발엔 Entity Framework를 사용예정. 하지만 SQL 직접 실행도 OK.
  • 암호화 대상은 영어, 일본어를 기본으로 어느 나라 언어가 올지는 아무도 모름.
  • DB기반이 아닌 암호화와 복호화도 조사해 보았으나 일본어의 한자 내용에 따라서 복호화시에 문자가 깨지는 상황이 자주 발생했기 때문에 DB에서 지원하는 암호화/복호화 기능을 사용하기로 함.


1. 검증용 DB작성(localDB)

 

 

 

2. 검증용 테이블 작성

 

 

USE [TESTDB01]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Table_1](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](500) NULL,
	[NameEnc] [varbinary](2000) NULL
) ON [PRIMARY]

GO

 

※암호화 한 데이터의 datatype은 varbinary 입니다.

 

 

3. 각종 언어를 사용해서 테스트용 데이터를 작성

 

 

INSERT문은 반드시 N을 붙여서 nvarchar로 등록합니다.

INSERT INTO [dbo].[Table_1]([Name]) VALUES (N'Name');

 

※datatype을 nvarchar로 등록하지 않으면 Char로 등록되어서 “???”같이 내용이 깨집니다...

 

 

4. 암호화

 

※’ENCRYPT’ <- 여기에 임의의 암호키를 설정 합니다.

UPDATE [dbo].[Table_1] SET [NameEnc] = ENCRYPTBYPASSPHRASE('ENCRYPT',Name);

 

 

 

※Name의 datatype이 nvarchar이기 때문에 ENCRYPTBYPASSPHRASE에 의해 nvarchar의 속성으로 암호화 됩니다.

 

문자열을 직접 입력해서 암호화 하고 싶은 경우엔 N’…’ <- 와 같이 설정합니다.

UPDATE [dbo].[Table_1] SET [NameEnc] = ENCRYPTBYPASSPHRASE('ENCRYPT',N'암호화 하고 싶은 내용');

 

 

5. 복호화

 

※’ENCRYPT’ <- 여기에 4에서 설정한 암호키를 설정 합니다.

SELECT [ID], [Name], [NameEnc]
  , CAST(DECRYPTBYPASSPHRASE('ENCRYPT',NameEnc) AS nvarchar(2000)) AS NameDec
FROM [TESTDB01].[dbo].[Table_1]

 

 

※복호화 한 다음 nvarchar 변환처리를 격납해 본 내용입니다.

 


보충 : MySQL의 경우

 

암호화

CAST(HEX(AES_ENCRYPT('암호화 할 데이터', '암호key')) AS CHAR)

 

복호화

CAST(AES_DECRYPT(UNHEX('복호화 할 데이터'), '암호Key') AS CHAR)

 

 

댓글