safe_string_cmp的目的是什么?

问题描述 投票:0回答:1

Flask的新手,正在学习描述如何制作REST API的课程。

该课程的作者建议使用身份验证一章中来自werkzeug.security的safe_str_cmp

如果有人可以帮助您理解该功能的目的以及何时/为什么使用它,我将不胜感激。

werkzeug
1个回答
0
投票

测试字符串相等性的显而易见的算法是这样的:

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

但是,使用此算法比较密码哈希存在一个微妙的问题。当两个字符串的开头附近有不同的字符时,循环内部的return使算法更快,而当两个字符串的开头附近具有相同的字符时,则使算法变慢。

这使比较容易受到timing attack的影响;通过尝试使用已知哈希值的密码并测量拒绝密码所花费的平均时间,攻击者有可能从统计角度确定在两个哈希的开头都存在多少个相同字符。通过尝试一系列不同的哈希值来一次连续发现一个或两个字节的真实密码哈希,攻击者可以推断出很大一部分,然后尝试在本地进行破解。

安全字符串比较算法可能看起来像这样:

# 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

由于使用相同哈希算法的所有密码哈希应具有相同的长度,因此理想情况下,此比较应始终花费相同的时间来比较两个哈希,从而避免了定时攻击。更一般而言,在将用户输入与任何秘密字符串进行比较时,都应使用安全字符串比较功能。

© www.soinside.com 2019 - 2024. All rights reserved.