【问题标题】:Testing equality of SHA-256 digests using bitwise operators使用按位运算符测试 SHA-256 摘要的相等性
【发布时间】:2017-04-05 23:37:34
【问题描述】:

我正在一个 nodeJS 应用程序中实现一个令牌系统,我需要检查两个使用 SHA256 散列的字符串是否相等。我最初的想法是,我可以使用严格的相等运算符 (hash1 === hash2) 简单地测试相等性,因为如果摘要具有相同的输入,它们应该产生相同的字符串。但是,我看到 Paragon Initiative 的一篇文章声称在每个字符的 ascii 代码上使用按位运算符比较字符串更安全。

为了比较摘要标记,Paragon 代码使用以下代码 sn-p (PHP):

public static function hash_equals($hash1, $hash2)
    ...

    $res = 0;
    $len = \strlen($hash1);
    for ($i = 0; $i < $len; ++$i) {
        $res |= \ord($hash1[$i]) ^ \ord($hash2[$i]);
    }
    return $res === 0;
}

基本上,每个索引处的字符使用按位异或,然后使用按位或保存到标志值。如果任何字符不匹配,则将差异保存在$res

这比使用严格的字符串比较更有效吗?哈希摘要只是字符串,我不知道为什么简单的字符串比较不如显式检查字符串中的每个 sing 字节有效。

文章参考:https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence 代码参考:https://github.com/psecio/gatekeeper/blob/7b8ec374e208148692316a34c1b4700d5407ef9b/src/Psecio/Gatekeeper/Gatekeeper.php

更新:

我研究了一下,npm 上的 scmp 工具可用于 Javascript 中的恒定时间字符串比较。

截至 2017 年 4 月 5 日,根据 nspsnyk 工具,它没有漏洞。

【问题讨论】:

    标签: php node.js sha256


    【解决方案1】:

    编辑:Use built in hash_equals in PHP for timing attack resistant compares.hash_equals PHP doc.左下方说明。

    您不应该使用字符串比较来测试哈希值的原因是它们经过优化,可以在知道字符串不相等时立即返回。

    在普通代码中,这是一件好事。您希望尽快获得结果。但是,在安全方面,这会泄露信息。

    如果攻击者反复提交不同的字符串,并且能够测量到他被拒绝访问之前的时间量的差异,他可以用它来确定他正确猜测了多少子字符串。

    请参阅this post on security.stackexchange.comthis blog post on timing attacks 了解更多信息。

    【讨论】:

    • 从你所说的来看,我认为我发布的代码中 for 循环的目的是确保每次处理哈希摘要所花费的时间相同,即使检测到错误,也会处理整个字符串长度。我想如果我想在我的应用程序中使用它,我只需要在 javascript 中实现相同的方法。
    • 这个工作需要按位比较吗?该解决方案的要点是,使用常规比较可以导致提前返回。如果您确保比较每个字符,是否使用常规字符比较 (===) 而不是按位运算符(^|)比较匹配索引处的字符?
    • @Copernicus 看起来 npmjs.com/package/secure-compare 可能是你想要的
    【解决方案2】:

    以比较普通字符串的方式比较哈希可能会使您的程序/应用程序/网站/任何东西容易受到timing attacks的影响。
    普通的字符串比较很快,你会尽快得到结果。但是在安全性方面,这种比较会泄露信息。通过测量检查某些字符串所需的时间差异,攻击者可以确定他猜对了多少子字符串。 (Anthony Ferrara 发布了一个非常好的article 详细解释了这一点)

    为了防止这种情况发生,我们必须使用完全相同的时间检查两个哈希值。在PHP(>5.6.0)中可以使用定时攻击安全字符串比较功能hash_equals()

    【讨论】:

      猜你喜欢
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 2015-03-18
      • 2012-12-31
      • 2011-03-02
      • 1970-01-01
      • 2016-10-18
      相关资源
      最近更新 更多