我编写了一种使用 hashlib 散列密码的方法。我允许用户通过 POST 方法发送密码,该方法由 Flask 接收,然后对密码进行哈希处理,以便可以根据存储的 var 检查哈希值是否相同。
当第一次发送正确或不正确的密码时,它都很好用。但是,如果用户在第一次 POST 时发送了错误的密码,然后使用正确的密码再次尝试,则会失败。(如果第一次尝试成功并且用户继续尝试,也可以将其视为失败,但我现在不在乎。)
hash.update(arg) 使用字符串 arg 更新哈希对象。重复调用等效于连接所有参数的单个调用: m.update(a); m.update(b) 等价于 m.update(a+b)。
我想知道如何在重复调用时禁用串联。这是否是一个hacky解决方法并不重要。
这是我的代码,以防它有用:
h = hashlib.sha256()
VALID_USERNAME = 'admin'
VALID_PASSW_HASH = "210ce034be6d826a451a4261d70494148c5d7101627335ccacf8e00a711bcc5d"
@app.route('/api/queue/auth', methods=['POST'])
def auth():
username = request.json.get('username')
password = request.json.get('password')
if bool(username) is False or bool(password) is False:
return "\nPlease fill in both fields.\n", 400
passwordBytes = password.encode(encoding='UTF-8',errors='strict')
h.update(passwordBytes)
if h.hexdigest() != VALID_PASSW_HASH or username != VALID_USERNAME:
return "\nPlease check your username and password, and try again.\n", 401
r.set('auth', 'true')
return "Access Granted.\n", 200
补充说明:
- “r.set”行(在最后一行之上)只是因为它后来对 Redis 做了一些事情。
- 我检查了 passwordBytes 在提供相同密码时总是返回相同的编码(它是确定性的)
- 如果在第一次尝试或另一次尝试中提供相同的密码,我还检查了 h.hexdigest() 是否返回不同的内容。所以考虑到这两点,我们可以确定问题出在 h.update() 上,可能是因为 concatenation 特性。