1. 데이터 해시화
데이터 해시화란? -> 데이터 해싱은 데이터를 고정 길이의 해시 값으로 변환
해시 함수는 원본 데이터를 복원할 수 없다!!
일반적으로 사용되는 해시 함수는 MD5, SHA-1, SHA-256이 있다
digest
digest를 사용하면 md5, sha1, sha256, sha512와 같이 평문을 해시화 할 수 있습니다.
반환 타입은 bytea 이므로 encode()함수를 사용해 16진수로 변환하여 사용하면 됩니다.
--MD5 해싱--
SELECT md5('mydata');
--결과--
md5 |
--------------------------------+
69380a4489890f8a53e0eddc36cd1379|
--SHA-1 해싱--
SELECT encode(digest('mydata', 'sha1'), 'hex');
--결과--
encode |
----------------------------------------+
28229485665f96e033333c22c3bdb508daefca17|
-- SHA-256 해싱
SELECT encode(digest('mydata', 'sha256'), 'hex');
--결과
encode |
----------------------------------------------------------------+
1eef510d81eea49161cd821b318aa999e630bdd292b093aa9a9319e9f282b984|
-- SHA-512 해싱
SELECT encode(digest('mydata', 'sha512'), 'hex');
--결과
encode |
--------------------------------------------------------------------------------------------------------------------------------+
aa0af12c5ba9036ce0ef813e35135f3cc91e71b63beadf38c3eacabd7f66e0abe634614c0b9d8635e2401ad6ed62df6a13e9a494a149d575326673cfca766e09|
2. 암/복호화
// PostgreSQL에서 암호화, 복호화를 하기 위해서는 pgcrypto 확장 모듈을 활성화 해야된다
CREATE EXTENSION IF NOT EXISTS pgcrypto;
// 암호화 방식
blowfish = bf
rijndael = aes
des = des
cast5 = cast5
3des = 3des
// 암/복호화 함수
encode / decode : 16진수 인코딩 / 디코딩
encrypt / decrypt : 암호화 / 복호화
3. 예제
myKey는 임의로 지정한 키다.
-- 암호화 : utf8로 변환한 후, 암호화키로 'aes'알고리즘을 사용하여 암호화한 후, 그 값을 16진수(hex)로 encoding함
select encode(encrypt(convert_to('누리','utf8'),'myKey','aes'),'hex');
-- 결과
encode |
--------------------------------+
9182658081cb1f480ef0911c5c94e19c|
-- 복호화 : 암호화의 역순. 16진수값을 decoding한 후 암호화를 해제하고, 그 값을 다시 utf8에서 변환함
select convert_from(decrypt(decode('9182658081cb1f480ef0911c5c94e19c','hex'),'myKey','aes'),'utf8');
--결과
convert_from|
------------+
누리 |
-- 예제 테이블 생성
CREATE TABLE public.tb_test (
mem_id text NOT NULL,
mem_name text NULL,
mobile_no text NULL,
CONSTRAINT tb_test_pkey PRIMARY KEY (mem_id)
);
-- 평문 데이터 입력
INSERT INTO tb_test(mem_id, mem_name, mobile_no) VALUES ('001', '누리', '01011112222');
-- 평문으로 저장된 mem_name을 암호화하기
select mem_id,
encode(encrypt(convert_to(mem_name, 'utf8'), 'myKey', 'aes'), 'hex') as mem_name_encrypted,
mobile_no
from tb_test;
-- 결과
mem_id|mem_name_encrypted
------+---------------------------------
001 |26e903ba68cc1efbff9f546e10b7b836
-- 평문값을 암호화하여 테이블에 저장하기(mem_name, mobile_no)
INSERT INTO tb_test(mem_id, mem_name, mobile_no)
VALUES ('002', encode(encrypt(convert_to('누리2','utf8'),'myKey','aes'),'hex'),
encode(encrypt(convert_to('01033334444','utf8'),'myKey','aes'),'hex'));
-- 결과
mem_id|mem_name |mobile_no |
------+----------------------------------+----------------------------------+
002 |622bbe95397a71fd5e682ec86c154f8e |e7f64443a5728e707e817ba5f031f95b |
-- 암호화 된 mem_name 값을 복호화하기
select mem_id, convert_from(decrypt(decode(mem_name,'hex'),'myKey','aes'),'utf8'), mobile_no from tb_test;
-- 결과
mem_id|convert_from|mobile_no |
------+------------+--------------------------------+
002 |누리2 |e7f64443a5728e707e817ba5f031f95b|
'DataBase > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 단방향, 양방향 암호화를 해보자 (0) | 2023.09.27 |
---|