2012-06-29 2 views
1

Я использую Google App Engine и PyCrypto для шифрования. Ошибка, которую я получаю, которая ниже, встречается только на моем локальном сервере разработки,, который работает под управлением Linux Mint Maya (13). Я применил тот же код к облаку GAE, и он работает без ошибок.Google App Engine + PyCrypto =/dev/urandom не доступно

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 

Питон код, который бросает ошибку на второй строке в этом блоке:

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. Затем я сделал быструю проверку разрешений на/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 

Так выглядит как мои права в порядке. Я также попытался запустить сервер разработки как root, но я получаю ту же ошибку. По какой-то причине это происходит только с сервером разработки, а не при развертывании в облаке Google. Любые идеи о том, что попробовать дальше?

Спасибо!

+0

Вы попробовали просто открыть приглашение на Python и выполнить 'from Crypto import Random'? – voithos

+0

@voithos, да я сделал это в питона терминале, без ошибок:. 'от Crypto импорта 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: Я предполагаю, что вы используете python 2.5 и pycrypto 2.2 из-за вашего Traceback. В следующий раз, пожалуйста, укажите эти данные.

+0

Перемещение этих двух строк вверху исправлено! Для записи я использовал 'python 2.7.3' и' pycrypto 2.4.1', поэтому ваше решение, вероятно, работает с несколькими версиями. Я обязательно включу эту информацию в следующий раз. – zzz

+0

Обратите внимание, что на данный момент поддерживается только PyCrypto 2.3 для python 2.7 и модифицированный PyCrypto 2.2 для python 2.5. –