2012-06-29 5 views
1

Google App Engine 및 PyCrypto를 사용하여 암호화를하고 있습니다. 아래에 나와있는 오류는 로컬 개발 서버 ()에만 이 발생하며 Linux Mint Maya (13)가 실행 중입니다. GAE 클라우드에 동일한 코드를 배포했는데 오류없이 실행됩니다.Google App Engine + PyCrypto =/dev/urandom 액세스 할 수 없음

from Crypto.Cipher import AES 
from Crypto import Random 

key = b'Sixteen byte key' 
iv = Random.new().read(AES.block_size) 
cipher = AES.new(key, AES.MODE_CBC, iv) 
return iv + cipher.encrypt(plaintext) 

이 오류를보고 후 I realized it might be a permissions error : 오류를 던지고

ERROR 2012-06-29 16:04:20,717 webapp2.py:1553] [Errno 13] file not accessible: '/dev/urandom' 
Traceback (most recent call last): 
    File "/home/eric/google_appengine/lib/webapp2/webapp2.py", line 1536, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "/home/eric/google_appengine/lib/webapp2/webapp2.py", line 1530, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "/home/eric/google_appengine/lib/webapp2/webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "/home/eric/google_appengine/lib/webapp2/webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "/home/eric/google_appengine/lib/webapp2/webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "/home/eric/google_appengine/lib/webapp2/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "/home/eric/workspace/commentbox/src/controller/api.py", line 55, in get 
    self.response.out.write(encrypt(json.dumps(to_json))) 
    File "/home/eric/workspace/commentbox/src/controller/api.py", line 27, in encrypt 
    iv = Random.new().read(AES.block_size) 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/__init__.py", line 33, in new 
    return _UserFriendlyRNG.new(*args, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/_UserFriendlyRNG.py", line 206, in new 
    return RNGFile(_get_singleton()) 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/_UserFriendlyRNG.py", line 200, in _get_singleton 
    _singleton = _LockingUserFriendlyRNG() 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/_UserFriendlyRNG.py", line 144, in __init__ 
    _UserFriendlyRNG.__init__(self) 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/_UserFriendlyRNG.py", line 86, in __init__ 
    self._ec = _EntropyCollector(self._fa) 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/_UserFriendlyRNG.py", line 53, in __init__ 
    self._osrng = OSRNG.new() 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/OSRNG/posix.py", line 60, in new 
    return DevURandomRNG(*args, **kwargs) 
    File "/usr/lib/python2.7/dist-packages/Crypto/Random/OSRNG/posix.py", line 42, in __init__ 
    f = open(self.name, "rb", 0) 
    File "/home/eric/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 592, in __init__ 
    raise IOError(errno.EACCES, 'file not accessible', filename) 
IOError: [Errno 13] file not accessible: '/dev/urandom' 
ERROR 2012-06-29 16:04:20,721 webapp2.py:1549] Exception 
ERROR 2012-06-29 16:04:20,721 webapp2.py:1549] AttributeError 
ERROR 2012-06-29 16:04:20,721 webapp2.py:1549] : 
ERROR 2012-06-29 16:04:20,721 webapp2.py:1549] "'DevURandomRNG' object has no attribute 'closed'" 
ERROR 2012-06-29 16:04:20,721 webapp2.py:1549] in 
ERROR 2012-06-29 16:04:20,721 webapp2.py:1549] <bound method DevURandomRNG.__del__ of <Crypto.Random.OSRNG.posix.DevURandomRNG object at 0x52707d0>> 
ERROR 2012-06-29 16:04:20,721 webapp2.py:1549] ignored 

파이썬 코드는 블록의 두 번째 행이다. 그럼 난/dev/urandom에 대한 사용 권한의 빠른 확인을 했어 :

[email protected] ~ $ dpkg -L udev | xargs grep urandom 
/lib/udev/rules.d/50-udev-default.rules:KERNEL=="null|zero|full|random|urandom", MODE="0666" 
[email protected] ~ $ ls -lart /dev/*random 
crw-rw-rw- 1 root root 1, 9 Jun 29 10:53 /dev/urandom 
crw-rw-rw- 1 root root 1, 8 Jun 29 10:53 /dev/random 

그래서 내 권한이 괜찮아 보인다. 또한 개발 서버를 루트로 실행하려고 시도했지만 동일한 오류가 발생합니다. 웬일인지 이것은 개발 서버에서만 발생하며 Google의 클라우드에 배포되지 않습니다. 다음에 무엇을 시도 할 것인가에 대한 아이디어가 있습니까?

감사합니다.

+0

파이썬 프롬프트를 열어서'Crypto import Random'에서 해봤습니까? – voithos

+0

@voithos는, 그래 난이 오류없이, 파이썬 터미널에서이 작업을 수행 한 :. '에서 암호화 수입 Random' 'Crypto.Cipher 수입 AES' 'Random.new() 읽기 (AES.block_size)에서' ''* \ xd85G \ x10 + \ xce \ xd2 \ x98 \ x85 \ xcd + \ xf5 \ xf5 [< '' – zzz

답변

2

GAE가 파일 액세스를 제한하고 /dev/urandom이 (가) 차단되어 사용자에게 표시되는 오류가 발생했습니다. 당신이 PyCrypto을 가져올 때 오류가 아닌

주, 그것은 당신이 할 때의 AES.new(key, AES.MODE_CBC, iv)

당신은 Crypto/Random/OSRNG/__init__.py을 편집하고 정상에 선을

if hasattr(os, 'urandom'): 
    from Crypto.Random.OSRNG.fallback import new 

를 이동하거나 의해 하나, 그것을 해결할 수 있습니다 스크립트의 시작 부분에서 os.name을 posix 또는 nt와 다른 것으로 수정하십시오. 나는 첫 번째 옵션을 제안한다.

ps : Traceback 때문에 python 2.5와 pycrypto 2.2를 사용하고 있다고 가정합니다. 다음 번에 이러한 세부 정보를 입력하십시오.

+0

] 위로 2 줄 이동하면 문제가 해결됩니다! 기록을 위해 필자는'python 2.7.3'과'pycrypto 2.4.1'을 사용했기 때문에 여러분의 솔루션은 아마도 여러 버전에서 작동 할 것입니다. 다음에 그 정보를 반드시 포함시켜야합니다. – zzz

+0

PyCrypto 2.3은 Python 2.7 및 Python 2.5 용 PyCrypto 2.2에서만 지원됩니다. –