我有一个应用程序,我需要检查给定的输入是否与存储的密码匹配。
这是代码的简化示例:
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 并且只能增加值)。
我应该担心吗?还是我做错了什么?