프로젝트를 진행하다 보면, 랜덤 값이 필요한 경우가 많이 생긴다.
특히 보안이 필요하다면 더욱 더...
암호화 된 값들과 해쉬 값들, 그리고 그것들로 위장한 의미 없는 값들...
단순한 인덱싱 조차도 1, 2, 3, 4, 5, ... 로 사용하는 것이 허용되지 않기도 한다.

다양한 케이스에서 랜덤값이 필요하게 되면서 알게된 것이 두 가지가 있다.
첫째는 python의 기본 random 모듈로는 요구 사항을 만족 시킬수 없는 부분이 있다.
둘째는 기본 random 모듈 이외에 추가적인 좋은 방법들이 있다.

그래서 이번에 사용한 방법들을 정리하고자 한다.

본인은 현재 '열혈강의 파이썬 개정판: 이강성저'를 참고서적으로 보고 있으며,
아래의 정리 내용은 책에 없는 내용만을 포함하고 있다.
아래 방법들을 사용하기에 앞 서
책에서 기본적인 내용을 우선 읽어보기를 권하는 바이다. 


1. random 모듈 [문서]

>>> import random
>>> import string
>>> c = string.letters + string.digits
>>> c
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
>>> v = ''.join(random.sample(c, 6))
>>> v
'yxEeLl' 


2. uuid 모듈 [문서]

세부적인 사항은 문서 링크를 참고하면 된다.
단순히 적당한 길이의 random 문자열이 필요하다면, 아래의 코드도 괜찮은 선택이다.

>>> import uuid
>>> uuid.uuid1()
UUID('8f9f01b8-923e-11e0-889b-1093e9020660')
>>> str(uuid.uuid1())
'98c3d57a-923e-11e0-ae95-1093e9020660'
>>> uuid.uuid4() 
UUID('6a81a0ca-dcfc-4024-883e-5abb29238b4d')
>>> str(uuid.uuid4()) 
'7ed3f7b9-84a5-4066-8e9c-e5e1bc370573' 


3. os 모듈의 urandom

os 모듈에는 urandom이라는 함수가 있다.
이 함수는 원하는 길이(byte단위)의 unsigned 수치값을 만들어 준다.
물론 int 형이나 long 형이 아니기 때문에 약간의 가공이 필요할 수 있다.
아래 방법은 암호화 알고리즘의 키를 생성하는데 유용하다.

>>> import os
>>> import binascii
>>> os.urandom(16)
'h\xb4\xaa<\x12\xa5\xc8\xaf\xa2sCr\x93\x01f\xdc'
>>> binascii.hexlify(os.urandom(16))
'7a26ada27ace29eb422c04efe7313526'
>>> int(binascii.hexlify(os.urandom(16)), 16)
69812220901636122490437131090184792388L 

|
오늘 보안 알고리즘에 약간의 변경을 가하기로 결정되어
RSA와 함께 AES를 섞어 쓰기로 결정 되었다.
때문에 python으로 AES 관련 코드 추가 작업을 진해하였다.

이미 M2Crypto를 쓰고 있으니
따로 암호화 모듈을 추가할 필요 없이 이를 이용했다.
M2Crypto를 보면서 문서화가 좀 거지같다는 생각을 했는데,
이번에도 역시...
그나마 테스트 케이스라도 있어서 다행이었다.
휴~

처음에는 AES 128bit CBC로 할까 했다가
IV가 필요없는 AES 128bit ECB로 결정...

아래 코드는 임의의 128bit 키를 만들어 짧은 평문을 암/복호화 한다.
 

import os
import cStringIO
from M2Crypto import EVP

skey = os.urandom(16)
plaintext = '12345'

# encrypt

aes = EVP.Cipher(alg='aes_128_ecb', key=skey, iv='', op=1)

buf = cStringIO.StringIO()

buf.write(aes.update(plaintext))

buf.write(aes.final())

ciphertext = buf.getvalue()

# decrypt

aes = EVP.Cipher(alg='aes_128_ecb', key=skey, iv='', op=0)

buf = cStringIO.StringIO()

buf.write(aes.update(ciphertext))

buf.write(aes.final())

plaintext = buf.getvalue() 

 
|
최신 버전의 Aptana에는 PyDev가 기본 설치되어 배포되며, 
Django 프로젝트 역시 함께 지원한다.

Aptana에서 Django 프로젝트를 개발하고 싶다면,
아래의 방법을 따르면 된다.

1. File → New → Project
2. [Select Wizard] Pydev → Pydev Django Project → Next
3. [Pydev Django Project] Project Name: mytest, Grammar Version: 2.6 → Next
4. [Reference Page] Next
5. [Django Settings] Finish 

6. Run → Run Configurations
7. Pydev Dajngo → New
8. [Main]
    Name: mytest,
    Project: mytest
    Main Module: ${workspace_loc:mytest/src/mytest/manage.py} 
9. [Arguments]
    Program Arguments:
        runserver
        0.0.0.0:8000
        --noreload 
 10. Apply → Run

위와 같이 하면 디버그 서버가 동작하는 것을 볼 수 있으며,
콘솔창에 디버그 정보가 보여진다.

브라우저에 http://127.0.0.1:8000/ 주소를 치면
Django 프로젝트가 성공적으로 로드 되었음을 확인할 수 있다.
 

'django' 카테고리의 다른 글

database에서 models.py 추출하기  (0) 2011.06.09
django에서 database table 이름 수동으로 지정하기  (0) 2011.06.09
|

ghilbut's Blog is powered by Daum & tistory