什么时候不能使用strcmp?

信息安全 哈希 定时攻击
2021-08-12 06:21:49

我读过不应该使用strncmp(userSuppliedPassword,origPassword,sizeOfArray)(或String.equals在 Java 中),因为可以使用计时攻击来猜测密码。相反,应该使用一种安全的字符串比较函数,无论比较失败还是成功,该函数都将花费相同的时间。

但是由于userSuppliedPasswordandorigPassword应该被散列(和加盐),除非一个人已经在做一些愚蠢的事情,否则似乎没有办法利用这种攻击。

那么这个建议什么时候是真的呢?

2个回答

正如您所说,当使用并非旨在抵抗定时攻击的字符串比较功能时,可以利用它来猜测您要与之比较的字符串。

比较未加密和未散列的字符串确实会泄漏原始字符串,无论是密码(存储在数据库中还是硬编码)、会话 ID、电子邮件地址或多因素身份验证令牌 - 这意味着这种攻击不限于“密码”的常识。

如果字符串被加密并且攻击者知道加密函数(使用关联的密钥),那么他们可以猜测加密字符串,然后对其进行解密以获得原始字符串。

如果字符串被散列并且攻击者知道散列函数(以及相关的盐,如果有的话),那么猜测每个字节的散列将越来越难(由于雪崩效应),因此很难猜测超过哈希的第一个字节,但如果您的原始字符串没有足够的熵,这可能足以暴力破解。

当您将任何用户提供的字符串(无论是否散列)与任何类型的敏感数据(见上文,我个人认为与一个用户相关的任何信息都是敏感的)进行比较时,此建议都是正确的。

虽然理论上是正确的,但这种定时攻击在许多实际场景中并不是特别相关。

  • 它与大多数类型的本地攻击场景无关,因为在那种情况下,通常会有更好的攻击向量。
  • 这与大多数远程攻击场景无关,因为不断变化的网络延迟会导致如此多的不确定性,以至于响应时间的几微秒差异是无法测量的。

定时攻击可能很重要的一种极端情况是攻击嵌入式硬件“黑匣子”系统时。例如智能卡或加密芯片组。