如何始终在恒定时间内比较两个长度可能不同的字符串?

时间:2019-05-02 23:18:21

标签: string security encryption cryptography comparison

我已经在互联网上阅读了有关此主题的信息,但是只能找到仅适用于2个相同长度的字符串的方法。在大多数情况下,它看起来非常相似,就像这样:

string userinput;
string password;
int falsekey = 0;

if(userinput.length != password.length){
    return 1;
}

for(i = password.length-1; i>=0; i--){
    falsekey |= userinput[i] ^ password[i];
}
return falsekey; 

但是,如果两个字符串的长度相同,则只有一个恒定时间字符串比较。因此,如果有人在寻找正确密码的长度,您可以使用定时攻击轻松找到它。

我试图想办法解决这个问题。也许通过查看用户输入的长度。

如果该长度小于密码长度,则在用户输入字符串中添加随机字符,直到它具有与密码相同的长度,然后在代码中启动for循环。 如果该长度大于密码长度,请从用户输入字符串中删除字符,直到它具有与密码相同的长度,然后在代码中启动for循环。

但是然后我认为会出现问题,因为在极少数情况下,通过添加随机字符,该程序可能会不小心添加那些为用户提供正确输入的字符,尽管这是一个错误的输入...:/

但是这种工作方式又有两种不同的长度怎么办?

1 个答案:

答案 0 :(得分:1)

在密码学中,例如,您需要常数时间字符串比较。比较加密密钥(以防止定时攻击),但是如果正确完成密码,则不是真正的情况。这是因为密码不应以原始形式存储。

相反,存储的是计算得出的密码哈希,然后通过计算所提供的密码上的哈希并将其与存储的密码哈希进行比较来进行验证。与存储的密码哈希进行的比较不会显示有关原始密码长度的任何信息

即使您有权访问存储的密码散列,也使用各种技术来防止获得密码,包括 one-way-hashes hash salting ,并使用慢散列通过蛮力反击密码。