2016-11-18

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
    제대로 암호화되어서 무슨 내용인지 알아볼 수 없네요. ^^;

댓글 없음:

댓글 쓰기