3

所以我在dotcloud上运行一个烧瓶python应用程序,我基本上是在尝试散列密码(使用hashlib.sha512;盐是uuid.uuid4().bytes)。

user_dict['salt'] = uuid.uuid4().bytes
print_stderr(user_dict['salt'])
print_stderr(hashlib.sha512(user_dict['pwd'] + user_dict['salt']))
user_dict['pwd'] = hashlib.sha512(user_dict['pwd'] + user_dict['salt']).digest()
print_stderr(user_dict['pwd'])

即使在 dotcloud 上的 python 解释器中,这一切都可以正常工作,但是当我实际在服务器上运行代码时,它会崩溃(或其他原因,客户端获取 HTTP 500 代码,但 dotcloud 日志刚刚关闭)。

我可以通过哪些print语句执行而哪些语句不执行来判断它就uuid.uuid4().bytes行了崩溃。但是如果我用一个常数(例如“uehg83yydh”)替换它,它不会立即失败,而是hashlib.sha512(...).digest()在线。

您可能还会注意到这print_stderr不是标准的 Python 函数。这是我用来让 dotcloud 从 python 打印东西的 hack(它打印到 stderr 而不是 stdout)。当然有一种更好的方法可以在我不知道的 dotcloud 上进行调试?

4

1 回答 1

1

试试这个为你的代码。

  1. 将 uuid 切换为十六进制而不是字节
  2. 更改为使用 update() 而不是将字符串添加在一起,它更干净一些。

代码:

>>> user_dict['salt'] = uuid.uuid4().hex
>>> print_stderr(user_dict['salt'])
>>> import hashlib
>>> m = hashlib.sha512()
>>> m.update(user_dict['pwd'])
>>> m.update(user_dict['salt'])
>>> user_dict['pwd'] = m.hexdigest()
>>> print_stderr(user_dict['pwd'])
于 2012-12-10T17:08:04.633 回答