【问题标题】:How always compare two strings of possibly different length in constant time?如何总是在恒定时间内比较两个可能不同长度的字符串?
【发布时间】:2019-05-02 23:18:20
【问题描述】:

我已经在互联网上阅读过有关此主题的内容,但只能找到仅适用于 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 循环。

但是我认为会有一个问题,因为在极少数情况下,通过添加随机字符,程序可能会意外添加那些为用户提供正确输入的字符,尽管它是错误的......:/

但是,如果有两种不同的长度,这还能如何工作呢?

【问题讨论】:

标签: string security encryption cryptography comparison


【解决方案1】:

在密码学中,如果您需要 constant-time-string-comparison,例如比较加密密钥(以防止定时攻击),但如果操作正确,密码并非如此。这是因为密码不应以原始形式存储。

而是存储密码的计算哈希值,然后通过计算所提供密码的哈希值并与存储的密码哈希值进行比较来完成验证。此与存储的密码哈希的比较不会泄露有关原始密码长度的任何信息

使用各种技术来防止获取密码,即使您可以访问存储的密码哈希值,包括 one-way-hasheshash salting 和使用慢散列来对抗通过暴力破解猜测密码。

【讨论】:

  • 谢谢!如果我理解正确,您是说我不应该直接将输入与密码进行比较,而是取用户输入,对其进行散列,然后将此散列与密码散列进行比较?两个哈希应该具有相同的长度,因此上面的代码可以在没有 IF 部分的情况下工作?
  • 基本上就是这样,但是您应该四处寻找专门为此完成的实现,因为我遗漏了许多技术细节。您通常会使用密码哈希方法和密码验证方法需要使用。
猜你喜欢
  • 2020-04-18
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多