[Django]개인정보 암호화

김예진·2020년 11월 22일
2

Django

목록 보기
7/10

위코드에서 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

profile
Backend Developer 🌱 벨로그 내용을 티스토리로 이사중~!

0개의 댓글