【问题标题】:python flask-security: encryption error "hash could not be identified"python flask-security:加密错误“无法识别哈希”
【发布时间】:2014-03-12 09:13:16
【问题描述】:

我在 Flask 项目中使用 Flask-Security。基本上一切正常,直到我尝试打开密码加密。基本上我遵循了这个:http://packages.python.org/Flask-Security/configuration.html 这导致我添加了这个:

app.config['SECURITY_PASSWORD_HASH'] = 'bcrypt'
app.config['SECURITY_PASSWORD_SALT'] = '$2a$16$PnnIgfMwkOjGX4SkHqSOPO'

不幸的是,这会导致错误:

File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1701, in __call__
return self.wsgi_app(environ, start_response)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1689, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1687, in wsgi_app
response = self.full_dispatch_request()
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request
rv = self.dispatch_request()
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1344, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/decorators.py", line 171, in wrapper
return f(*args, **kwargs)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/views.py", line 72, in login
if form.validate_on_submit():
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_wtf/form.py", line 123, in validate_on_submit
return self.is_submitted() and self.validate()
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/forms.py", line 165, in validate
if not verify_password(self.password.data, self.user.password):
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/flask_security/utils.py", line 84, in verify_password
return _pwd_context.verify(get_hmac(password), password_hash)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/passlib/context.py", line 2534, in verify
record = self._get_or_identify_record(hash, scheme, category)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/passlib/context.py", line 2258, in _get_or_identify_record
return self._identify_record(hash, category)
File "/home/geoadmin/.virtualenvs/flask/lib/python2.7/site-packages/passlib/context.py", line 1455, in identify_record
raise ValueError("hash could not be identified")
ValueError: hash could not be identified

我对正在发生的事情一无所知。我以为我生成了一个很好的 bcrypt 哈希,但是网站上没有密码加密的真实示例,错误本身让我感到困惑:/

使用的软件: - Ubuntu 12.04LTS - Python 2.7.2 - 烧瓶 0.9 - 烧瓶安全 1.5.4 - 通过 MongoAlchemy 在 MongoDB 2.2 上运行

感谢您的帮助!!

编辑:感谢 Bikeshedder,这可能是罪魁祸首:

# Create a user to test with
@app.before_first_request
def create_user():
    user_datastore.create_user(email='test@test.net', password='testerdetest')

我假设 create_user 方法会自动加密密码。但显然它没有......这里的文档并不是很清楚:

Class flask_security.datastore.MongoEngineUserDatastore(db, user_model, role_model)
A MongoEngine datastore implementation for Flask-Security that assumes the use of the Flask-MongoEngine extension.
create_user(**kwargs)
Creates and returns a new user from the given parameters.

编辑 2:根据 BikeShedder 的建议,我将标准用户创建更改为:

# Create a user to test with
@app.before_first_request
def create_user():
    user_datastore.create_user(email='test@test.net', password=bcrypt.hashpw('testerdetest', app.config['SECURITY_PASSWORD_SALT'])

这样就解决了错误,但它给了我一个“无效密码”,这意味着烧瓶安全所做的事情与我在加密中所做的不同......啊!

编辑 3:从 bcrypt 更改为 passlib(flask-security 也使用)

app.config['SECURITY_PASSWORD_SALT'] = '/2aX16zPnnIgfMwkOjGX4S'

user_datastore.create_user(email='test@test.net', password=passlib.hash.bcrypt.encrypt('testerdetest', salt=app.config['SECURITY_PASSWORD_SALT']))

仍然得到一个无效的密码:( 如果我查看https://github.com/mattupstate/flask-security/blob/develop/flask_security/utils.py 的源代码,它似乎只使用了 sha512 加密......然后我不明白文档......

编辑 5:已解决(感谢您让我找到正确的方向!) flask.ext.security.utils.encrypt_password() 成功了。但是,我仍然怀疑它是否真的是 bcrypt,但好吧,它至少是加密的......

【问题讨论】:

  • 或者你可以只使用from flask.ext.security.registerable import register_user,它将支持电子邮件通知等

标签: python flask


【解决方案1】:

我遇到了同样的问题,我解决了:

from flask.ext.security.utils import encrypt_password
user_datastore.create_user(email='test@test.fr', password=encrypt_password('password'))

优点是我们可以选择我们想要的 SECURITY_PASSWORD_HASH 和 SECURITY_PASSWORD_SALT 值。

【讨论】:

    【解决方案2】:

    由于您没有解释此错误何时发生,我不得不猜测它是在尝试登录时发生的。

    如果是这种情况,这意味着存储在数据库中的密码格式错误。它可能仍然是纯文本,Flask-Security 无法找出正在使用的散列算法。

    解决此问题的最简单方法是重置用户的密码。

    【讨论】:

    • 嗨!糟糕:是的,当我尝试登录时会发生这种情况。简短的版本是还没有用户。但是您确实有一点:自动创建的用户(根据 Flask-Security 的指南)没有散列密码。我假设 Flask_Security 会自动执行此操作(在用户创建期间加密密码),但显然它没有。我会进一步调查。非常感谢!
    【解决方案3】:

    developer 的老问题但明确的答案...

    这完全取决于您如何将用户添加到您的数据库。如果你已经设置 SECURITY_REGISTERABLE = True,并且仅通过 内置注册表,然后你会没事的。如果您要添加 任何其他方式的用户,您必须使用加密密码 flask_security.utils.encrypt_password 在保存用户记录之前 你的数据库。

    from flask.ext.security.utils import encrypt_password
    db.create_user(email='test@test.com', password=encrypt_password('password'))
    

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 2018-03-01
      • 1970-01-01
      • 2016-03-20
      • 2017-09-19
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多