Flask 的新手,正在学习描述如何制作 REST API 的课程。
该课程的作者建议在身份验证章节中使用来自 werkzeug.security 的safe_str_cmp。
如果有人可以帮助理解该功能的目的是什么以及何时/为什么应该使用它,我将不胜感激。
kay*_*ya3 13
测试字符串相等性的明显算法是这样的:
def strings_equal(s1, s2):
if len(s1) != len(s2):
return False
for i in range(len(s1)):
if s1[i] != s2[i]:
return False
return True
Run Code Online (Sandbox Code Playgroud)
但是,使用此算法来比较密码哈希值存在一个微妙的问题。在return从内循环,使算法快,当两个字符串具有起点附近不同的人物,慢时,他们有接近年初相同的字符。
这使得比较容易受到时序攻击;通过尝试使用已知散列的密码并测量密码被拒绝所需的平均时间,攻击者可以从统计上确定两个散列的开头有多少相同的字符。通过尝试一系列不同的哈希值,一次连续发现一两个字节的真实密码哈希值,攻击者可以推断出其中的很大一部分,然后尝试在本地对其进行破解。
安全字符串比较算法可能如下所示:
# warning: example only! this hasn't been proven secure!
# don't use in real code!
def strings_equal(s1, s2):
if len(s1) != len(s2):
return False
result = True
for i in range(len(s1)):
# use & for non-short-circuiting
result = result & (s1[i] == s2[i])
return result
Run Code Online (Sandbox Code Playgroud)
由于使用相同散列算法的所有密码散列都应该具有相同的长度,理想情况下,这种比较应该总是花费相同的时间来比较两个散列,从而防止定时攻击。更一般地说,任何时候将用户输入与任何秘密字符串进行比较时,都应该使用安全字符串比较函数。
| 归档时间: |
|
| 查看次数: |
1077 次 |
| 最近记录: |