我应该如何构建挑战 - 响应认证的随机挑战?

时间:2015-11-06 16:09:37

标签: c security authentication random

我正在审核加密质询 - 响应协议的实施。密码用作加密加密nonce(挑战)的密钥,并将结果与​​响应进行比较。

目前,nonce并不是真正安全的,因为它是通过srand()rand()获得的。随机数种子的所有成分(以秒为单位的当前时间(!)和pid)很容易猜到中间的人。这显然不是很好,但我的问题是,这在防止重放攻击方面有多糟糕?是否应该从CSPRNG(例如/ dev / urandom)获得挑战?有没有人指出最佳做法?

2 个答案:

答案 0 :(得分:1)

如果您担心挑战不够随机和/或无法预测,那么总会将您想到的所有内容添加到(长字符串)并计算单向散列。

所以伪随机数,time(),连接的IP地址,源端口号,用户名,挑战生成器保密的长字符串,pid,...越多越好。

如果其中任何一个发生变化,结果哈希会发生显着变化,并且在那里给出长字符串......在挑战变得可预测之前,需要猜测它或反转哈希值。

它也带来了相当独特的挑战(您需要在哈希中找到冲突,以使挑战不唯一)。

那就是说,如果重复出现挑战的几率(伪随机数发生器就是恕我直言),我认为挑战的目的已经达到了。

在基于挑战的身份验证方案中,我会担心的是在服务器上存储密码。它可以通过盐渍存储和缓慢的哈希来完成,但许多实现只是存储共享的秘密,而且恕我直言的确是个坏主意。

参考盐渍挑战响应计划:https://en.wikipedia.org/wiki/Salted_Challenge_Response_Authentication_Mechanism

答案 1 :(得分:0)

如果您的哈希和密码都很好,那么挑战是否可预测并不重要。一旦提交了公共知识,就面临挑战。最重要的是永远不要重复挑战,因为反应可能被截获。

正如我所看到的,如果你可以保持单调递增,那么简单的递增nonce就可以在这里工作。

或许这里有一些我不明白的漏洞?