1

我有一个应用程序,我需要检查给定的输入是否与存储的密码匹配。

这是代码的简化示例:

int authorize_(const uint8_t input[restrict HASH_SIZE], const uint8_t password[restrict HASH_SIZE])
{
    // Compare each byte to prevent timing attacks. Make sure the compiler doesn't optimize the comparison.

    unsigned diff = 0;
    size_t index;

    for(index = 0; index < HASH_SIZE; ++index)
        diff += (input[index] != password[index]);

    return diff;
}

#define authorize(i, p) (bool)(authorize_((i), (p)) == 0)

我阅读了有关计时攻击的信息,这是我的解决方案:函数 authorize_ 始终检查所有字符以确保检查始终花费相同的时间。由于外部函数只关心结果是否为 0,因此我有一个宏来进行检查。

但是我担心链接时间优化是否会导致函数在第一次不匹配时停止(因为 diff 已经 != 0 并且只能增加值)。

我应该担心吗?还是我做错了什么?

4

0 回答 0