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