1

Google App Engine と PyCrypto を使用して暗号化を行っています。以下に示すエラーは、Linux Mint Maya (13) を実行しているローカル開発サーバーでのみ発生します。同じコードを GAE クラウドにデプロイしたところ、エラーなく実行されました。

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

エラーをスローしている python コードは、このブロックの 2 行目です。

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)

このエラーを確認した後、権限エラーである可能性があることに気付きました。そこで、/dev/urandom のアクセス許可を簡単に確認しました。

eric@eric-Latitude-E5400 ~ $ dpkg -L udev | xargs grep urandom
/lib/udev/rules.d/50-udev-default.rules:KERNEL=="null|zero|full|random|urandom", MODE="0666"
eric@eric-Latitude-E5400 ~ $ 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 のクラウドにデプロイされた場合には発生しません。次に何を試すかについてのアイデアはありますか?

ありがとう!

4

1 に答える 1

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 を使用していると思います。次回はこれらの詳細を含めてください。

于 2012-06-29T17:18:54.407 に答える