security.generate_password_hash生成的哈希中可以出现哪些符号?

时间:2018-06-19 08:47:15

标签: flask hash base64 werkzeug pbkdf2

出于学习目的,我正在构建一个网站,其中包括用户注册和后续帐户激活功能。我使用Flask 0.12.2和Python 3.6.1。

我正在根据他们的登录信息为每个用户生成一个激活令牌,如下所示:

from werkzeug import security

activation_token = security.generate_password_hash('login', method='pbkdf2:sha512')

然后我打算向用户发送一个链接,该链接将包含生成的activation_token作为GET参数或仅作为URL的一部分。所以,我想确认生成的令牌只能包含ASCII字符(以避免任何问题,因为它将成为URL的一部分)。我无法找到有关生成哈希的字符可能包含的信息,无论是official werkzeug documentation page还是Wikipedia article on PBKDF2

尽管如此,我目前的猜测/理解是哈希是用Base64编码生成的,如Wikipedia Base64 article中所述(突出显示是我的):

  

Base64是一组类似的二进制文本编码方案,以ASCII字符串格式表示二进制数据 ...

因此,散列必须是ASCII。但同样的Wikipedia article, mentions(再次,亮点是我的):

  

选择用于表示基数的64个位值的特定64个字符集在实现之间变化。   ...   例如,MIME的Base64实现使用A-Z,a-z和0-9作为前62个值。 其他变体分享此属性,但为最后两个值选择的符号不同;一个例子是UTF-7。

并且listed Base64 table包含+\作为表格的最后两个字符(如果这些字符成为网址的一部分,则可能会出现问题)。

我的问题是:

  1. 我是否正确假设通过security.generate_password_hash('login', method='pbkdf2:sha512')生成的哈希将采用Base64编码?
  2. 假设所有哈希函数(至少在Web开发中使用的函数)在Base64或Hex中生成哈希是否安全?
  3. 如果我的第一个假设是正确的:security.generate_password_hash使用的Base64表格中最后两个字符是什么?

0 个答案:

没有答案