@마크다운
#
파이썬에서 pycrypto라는 암호화 모듈을 사용할 수 있는데
실제 파이썬3 이상의 환경에서 사용시 동작을 하지 않는경우가 발생한다.
이유는 pycrypto라는 모듈이 파이썬2를 기준으로 만들어 졌기 때문이다.
물론 위의 문제를 해결할수 있도록 `easy install`을 사용하거나 기타등등의 방법이 있지만
너무 불편하다.
#
예를들어 AWS같은 클라우드 서비스를 사용할때 `requirement`를 `easy install` 때문에 별도로 작성해야한다던가 하는 귀찮음이 있다.
그래서 본 글에서는`pycrypto`를 사용하지 않고 `pycryptodome`을 사용했다.
#
기존의 pycrypto를 파이썬3에 맞게 이식한 모듈인거 같다.
```
pip install pycryptodome
```
[pycryptodome 공식문서](https://pycryptodome.readthedocs.io/en/latest/)
```
class MyCrypto:
@staticmethod
def encodeAES(data):
key = base.SECRET_KEY[0:16].encode()
cipher = AES.new(key, AES.MODE_EAX)
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data.encode())
return ciphertext, tag, nonce
@staticmethod
def decodeAES(ciphertext, tag, nonce):
key = base.SECRET_KEY[0:16].encode()
cipher = AES.new(key, AES.MODE_EAX, nonce)
decoded = cipher.decrypt_and_verify(ciphertext, tag)
return decoded
@staticmethod
def encodeBase64(key1, key2):
encode_key = base64.encodestring(key2 + b' | ' + key1)
return encode_key
@staticmethod
def decodeBase64(key):
decode_key = base64.decodestring(key)
decode_key_split = decode_key.split(b' | ')
return decode_key_split
```
#
위의 코드는 본인이 사용하는 코드이다.
#
AES를 사용하였다 [AES 위키피디아](https://ko.wikipedia.org/wiki/%EA%B3%A0%EA%B8%89_%EC%95%94%ED%98%B8%ED%99%94_%ED%91%9C%EC%A4%80)
#
`pycryptodome`은 AES로 암호화를 하게 되면
`암호화 된 문자열`,`MAC` 두가지 값을 리턴하게 되고
추가적으로 `nonce`라는 값을 리턴해줘야 한다.
#
즉 암호화된 문자열과 키가2개, 총 3개가 리턴이 된다.
#
이 암호화를 쓰게 된 이유는 데이터베이스에 특정값을 보여주고 싶지 않아서 사용하려고 했던건데 매번 바뀌는(nonce,tag)값들이 존재하니 무언가 상황이 아주 애매해졌다.
#
그래서 암호화를 했을때 나오는 키값을 다시 base64로 인코딩하여 데이터베이스에 저장을했고 특정값을 복호화할때 base64로 암호화된 키 문자열을 복호화를 진행하고
다시 AES로 복호화를 하는 과정으로 만들었다.
#
물론 이 과정이 별로 만족스럽지 않고 암호화된 문자열과 키값이 같은 데이터베이스안에 들어가 있다는게 껄끄러웠지만 마땅한 해결책을 아직 찾기 못하였다.
'notes' 카테고리의 다른 글
해외결제모듈 붙이기 ( eximbay,python ) (1) | 2018.06.18 |
---|---|
git commit 100MB이상 파일 지우기 (0) | 2017.12.07 |
rest API에 페이스북 로그인 (소셜 로그인)하기 (0) | 2017.09.19 |
docker안에서 인코딩타입, 시간 설정 바꾸기 (1) | 2017.09.12 |
django generic view 사용시 method마다 다른 serializer사용하고 싶을 때 (0) | 2017.09.12 |