我正在使用passlib == 1.7.1进行以下导入:
from passlib.apps import custom_app_context as pwd_context
然后使用以下内容对密码进行哈希处理:
pwd_context.encrypt(password)
然后我验证:
pwd_context.verify(password, self.password_hash)
这很好,但验证失败并带有某些字符。例如“£”或“$”。
有人知道为什么会这样吗?
谢谢!
更新
非常感谢你们。有了这个信息,我调查了一下,似乎问题不是passlib,而是位于angular4之间,我将base64授权标头发送到烧瓶应用程序。
我目前正在使用以下内容来执行此操作:
let headers: Headers = new Headers({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa(userLoginRequest.username + ':' + userLoginRequest.password)
});
我今天已经阅读了很多关于unescape的内容(而且它的折旧有利于decodeURI())。我还阅读了很多关于base64编码中对unicode的支持。我尝试了很多这些东西的组合,但没有任何区别。我现在真的很困惑!
为了测试发生了什么,我会执行以下操作。在angular4中,我执行以下操作:
let encodedString = btoa('doug:Tree£9')
console.log(encodedString)
console.log(atob(encodedString))
正如所料,这会将以下内容打印到控制台。
ZG91ZzpUcmVlozk=
doug:Tree£9
所以编码和解码显然没问题。
在Python中执行相同的过程...
import base64
encoded = base64.b64encode('doug:Tree£9')
print encoded
print base64.b64decode(encoded)
我在终端获得以下内容。
ZG91ZzpUcmVlwqM5
doug:Tree£9
我注意到“ZG91ZzpUcmVlozk =”和“ZG91ZzpUcmVlwqM5”不一样。但是,这两种方法都在他们自己的语言中工作。
如果我将来自javascript的“ZG91ZzpUcmVlozk =”编码字符串放入python并按如下方式解码...
import base64
print base64.b64decode("ZG91ZzpUcmVlozk=")
我明白了:
doug:Tree�9
请注意,£字符现已被混淆。
其他Unicode字符也会失败。
所以我认为问题是如何对Authorization标头进行编码,以便python正确识别£字符,以及用户为其密码选择的任何其他角色?
非常感谢!
编辑:已解决!
我发现了这个Using Javascript's atob to decode base64 doesn't properly decode utf-8 strings,其中有一些细节。我使用@brandonscript推荐的以下方法解决了这个问题。
b64EncodeUnicode(str) : string{
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode(parseInt(p1, 16))
}))
}
完美的作品!呼!
答案 0 :(得分:0)
我猜您从文档中遇到了编码问题,
http://passlib.readthedocs.io/en/stable/narr/hash-tutorial.html#hashing
使用PasswordHash.hash()来散列密码。此调用负责 unicode编码 ....
from passlib.hash import pbkdf2_sha256
hash = pbkdf2_sha256.hash("$password")
pbkdf2_sha256.verify("$password", hash)
# True
答案 1 :(得分:0)
# -*- coding: utf-8 -*-
from passlib.apps import custom_app_context as pwd_contex
password='£$'
encrypted=pwd_contex.encrypt(password)
print(pwd_contex.verify('£$', encrypted))
print(pwd_contex.verify('john', encrypted))
True
False
在我的系统上运行得非常好。也许您需要在脚本顶部设置默认编码# -*- coding: utf-8 -*-