위코드에서 1,2차 프로젝트를 할 때는 유저의 아이디, 비밀번호, 닉네임 정보만 필요했고, 그 중에서도 유저의 비밀번호만 '해쉬함수'를 사용해서 암호화한 후 데이터베이스에 저장했다.
그런데 이번 기업 협업 중에는 이전보다 더 많은 정보(주민등록번호, 계좌번호 등등)를 저장해야했다.
처음에는 암호화없이 저장해도 되지 않을까? 아닌가? 중요한 개인정보니까 암호화를 해야하지 않을까? 무척 고민하다가 일단 멘토님들께도 여쭤봐놓고, 팀원과도 상의하고, 또 인터넷을 열심히 찾아본 결과
개인정보 보호법에 따라 암호화가 필요한 게 맞고, 비밀번호 암호화처럼 '해쉬함수'를 사용하는 것이 아니라 '블록암호'를 사용해서 암호화해서 저장하고, 권한을 가진 사람(관리자 혹은 임원)에게만 복호화해서 정보를 볼 수 있도록 해야했다.
그 중에서도 AES-256을 사용하기로 했다.
라이브러리 설치
pip install pycryptodomex
from Cryptodome.Cipher import AES
from Cryptodome import Random
from Cryptodome.Protocol.KDF import PBKDF2
import base64
import my_settings
BLOCK_SIZE = 16
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
def get_private_key(random):
salt = my_settings.SECRET.get('salt')
kdf = PBKDF2(random, salt, 64, 1000)
key = kdf[:32]
return key
def encrypt(raw, random):
private_key = get_private_key(random)
raw = pad(raw).encode('utf-8')
iv = Random.new().read(AES.block_size)
cipher = AES.new(private_key, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(raw))
def decrypt(enc, random):
private_key = get_private_key(random)
#base64로 decode
enc = base64.b64decode(enc)
iv = enc[:16]
cipher = AES.new(private_key, AES.MODE_CBC, iv)
return unpad(cipher.decrypt(enc[16:]))
참고 출처 : https://blog.naver.com/chandong83/221886840586
참고 출처 : https://inma.tistory.com/145
참고 출처 : https://jinisbonusbook.tistory.com/67