Django 1.10.3 Tutorial : 개인정보 양방향암호화(AES256) 하기
- 이 예제에는 개인정보 데이터가 없긴 하지만, 핸드폰(Mobile)을 개인정보라 간주하고 암호화를 진행해보겠습니다.
$PRJNAME/web/prjname/models/crypto.py
파일을 생성한다. 여기에 암호화 함수가 들어갑니다.# -*- coding: utf-8 -*- # prjname/models/crypto.py # 참고 : # http://third9.tistory.com/261 # http://blog.dokenzy.com/archives/1997 import base64 from Crypto.Cipher import AES from django.conf import settings class MyCrypto: def __init__(self): BLOCK_SIZE = 32 PADDING = '|' # The key argument should be the AES key, # either 16, 24, or 32 bytes to select AES-128, AES-192, or AES-256. # secret = "140b41b22a29beb4061bda66b6747e14" secret = settings.SECRET_KEY[:32] # AES-256 cipher = AES.new(secret) pad = lambda s: s + (BLOCK_SIZE - len(s.encode('utf-8')) % BLOCK_SIZE) * PADDING self.encodeAES = lambda s: base64.b64encode(cipher.encrypt(pad(s))) self.decodeAES = lambda e: cipher.decrypt(base64.b64decode(e)).decode("utf-8").rstrip(PADDING) def encodeAES(self, data): encoded = self.encodeAES(data) return encoded def decodeAES(self, data): decoded = self.decodeAES(data) return decoded
$PRJNAME/web/prjname/models/admin.py
에 다음을 추가합니다.... from .crypto import MyCrypto ... def _get_mobile(self): crypto = MyCrypto() return crypto.decodeAES(self.mobile) def _set_mobile(self, value): crypto = MyCrypto() self.mobile = crypto.encodeAES(value) enc_mobile = property(_get_mobile, _set_mobile) ...
$PRJNAME/web/prjname/views/mgmt/admin.py
에서 관리자추가, 관리자수정에 관련된 메소드를 수정합니다.... # 관리자 추가 ... # admin.mobile = form.cleaned_data['mobile'] admin.enc_mobile = form.cleaned_data['mobile'] ... # 관리자 수정 폼 ... # 'mobile': admin.mobile } 'mobile': admin.enc_mobile } ... # 관리자 수정 ... # admin.mobile = admin_mobile admin.enc_mobile = admin_mobile ...
$PRJNAME/web/prjname/templates/mgmt/index.html
에서
xyz/views/mgmt/admin/index.ejs
와xyz/views/mgmt/admin/update_form.ejs
에서admin.mobile
으로 표시된 부분을admin.enc_mobile
으로 변경합니다.
- DB의 내용을 모두 삭제한 후에, 관리자를 추가해봅니다. 그리고, DB에서 Nick 이 암호화되어 있는지도 봅시다.
$ sqlite3 db.sqlite3 SQLite version 3.15.0 2016-10-14 10:20:30 Enter ".help" for usage hints. sqlite> select * from tb_admin; 8|user1|03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4|nick1|t22TvgBZXvjlV6cu8Bi1P3kowOEPA052zOkEP9KIQM8=|2016-11-18| sqlite> .quit
제대로 암호화되어서 무슨 내용인지 알아볼 수 없네요. ^^;
댓글
댓글 쓰기