Security 在防止定时攻击时,以不同长度退出是否安全?

Security 在防止定时攻击时,以不同长度退出是否安全?,security,hash,bcrypt,Security,Hash,Bcrypt,例如,在某些库中,我们可以看到,如果两个字符串的长度不同,代码会提前退出: def常量时间比较(val1,val2): 如果两个字符串相等,则返回True,否则返回False。 所用的时间与匹配的字符数无关。 ''' 如果len(val1)!=len(val2): 返回错误 结果=0 对于拉链中的x,y(val1,val2): 结果|=ord(x)^ord(y) 返回结果==0 这真的安全吗?这无疑向攻击者揭示了这两个字符串在早期长度不同并泄露了信息 在防止定时攻击时,以不同长度退出是否安全

例如,在某些库中,我们可以看到,如果两个字符串的长度不同,代码会提前退出:

def常量时间比较(val1,val2):
如果两个字符串相等,则返回True,否则返回False。
所用的时间与匹配的字符数无关。
'''
如果len(val1)!=len(val2):
返回错误
结果=0
对于拉链中的x,y(val1,val2):
结果|=ord(x)^ord(y)
返回结果==0
这真的安全吗?这无疑向攻击者揭示了这两个字符串在早期长度不同并泄露了信息

在防止定时攻击时,以不同长度退出是否安全

通常不会,但这要视情况而定

函数本身

无论长度比较如何,此函数都将通过定时攻击泄漏信息,因为它的运行时间始终取决于其输入的长度

通过长度比较,当两个输入长度相同时,运行时间将发生变化

如果不进行长度比较,运行时间将根据较短输入的长度而变化(因为
zip
)。一旦攻击者控制的输入超过其他输入的长度,运行时间将保持不变

虽然此函数的运行时间很短(不科学的测试显示32字节的输入少于0.1ms),但在现实情况下,由于网络延迟变化等其他因素,攻击者很难利用此功能。攻击者可能需要已经在执行代码的机器上,才能真正利用这一弱点

关于bcrypt的问题

但是,在flask bcrypt的上下文中,此函数仅用于比较散列,而不是直接用户输入。因为bcrypt输出的散列长度是固定的,所以
返回False
不应该实际执行。因此,当与bcrypt一起使用时,此函数不存在计时攻击

Flask bcrypt使用此函数检查相等性,因为python(=)中正常字符串比较的运行时间将根据字符串的内容而改变。考虑相同长度的两个几乎相同的字符串,如果两个字符串的第一个字符不同,则= =比较将比在最后一个字符串的字符出现差异时更快。

我想说的是,在这种情况下,常量时间字符串比较实际上是不必要的。攻击者的目标是根据处理时间推断存储的哈希值,攻击者需要知道其输入产生了什么哈希值才能实现这一点。要知道产生了什么散列,唯一的方法是让攻击者知道workfactor和salt,如果他们有这些信息,那么他们也已经有了散列(因为它们都存储在一起)。在这种情况下,没有理由开始执行攻击

在防止定时攻击时,以不同长度退出是否安全

通常不会,但这要视情况而定

函数本身

无论长度比较如何,此函数都将通过定时攻击泄漏信息,因为它的运行时间始终取决于其输入的长度

通过长度比较,当两个输入长度相同时,运行时间将发生变化

如果不进行长度比较,运行时间将根据较短输入的长度而变化(因为
zip
)。一旦攻击者控制的输入超过其他输入的长度,运行时间将保持不变

虽然此函数的运行时间很短(不科学的测试显示32字节的输入少于0.1ms),但在现实情况下,由于网络延迟变化等其他因素,攻击者很难利用此功能。攻击者可能需要已经在执行代码的机器上,才能真正利用这一弱点

关于bcrypt的问题

但是,在flask bcrypt的上下文中,此函数仅用于比较散列,而不是直接用户输入。因为bcrypt输出的散列长度是固定的,所以
返回False
不应该实际执行。因此,当与bcrypt一起使用时,此函数不存在计时攻击

Flask bcrypt使用此函数检查相等性,因为python(=)中正常字符串比较的运行时间将根据字符串的内容而改变。考虑相同长度的两个几乎相同的字符串,如果两个字符串的第一个字符不同,则= =比较将比在最后一个字符串的字符出现差异时更快。

我想说的是,在这种情况下,常量时间字符串比较实际上是不必要的。攻击者的目标是根据处理时间推断存储的哈希值,攻击者需要知道其输入产生了什么哈希值才能实现这一点。要知道产生了什么散列,唯一的方法是让攻击者知道workfactor和salt,如果他们有这些信息,那么他们也已经有了散列(因为它们都存储在一起)。在这种情况下,没有理由开始执行攻击