我在一个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 hash,但网站上没有真正的密码加密示例,错误本身也让我感到困惑:/
使用的软件:-Ubuntu12.04LTS-Python2.7.2- FLask 0.9 -Flask-安全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'])这样就解决了这个错误,但它给了我一个“无效密码”,这意味着flask-security所做的事情与我在加密时所做的事情不同……啊!
编辑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']))仍然得到一个无效的pw :(如果我查看https://github.com/mattupstate/flask-security/blob/develop/flask_security/utils.py的源代码,它似乎只使用了sha512加密……那我就不懂文档了。
编辑5:已解决(感谢您将我带到正确的方向!)flask.ext.security.utils.encrypt_password()做到了这一点。然而,我仍然怀疑它是否真的是bcrypt,但好吧,它至少是加密的……
发布于 2013-01-28 21:28:32
由于您没有解释这个错误是什么时候发生的,我只能猜测它是在尝试登录时发生的。
如果是这种情况,这意味着存储在数据库中的密码的格式错误。它可能仍然是纯文本,而Flask-Security无法找出正在使用的哈希算法。
解决此问题的最简单方法是重置用户的密码。
发布于 2013-06-12 20:04:14
我也有同样的问题,我用以下方法解决:
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值。
发布于 2014-03-12 09:13:17
老问题,但来自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'))https://stackoverflow.com/questions/14562911
复制相似问题