2011-06-13 172 views
2

技术上有两个问题 - 但它们之间的关系如此密切,我不想将它们分开;但如果社区觉得我应该,我会的。实施SCRAM - 随机数验证和服务器/客户端密钥

recent question我正在为网站登录和Web服务API实施SCRAM。客户端环境将是.Net和Javascript(将来可能会有Java)。

我的第一个问题是基本的:The protocol utilises a client and server key作为身份验证过程中的关键步骤;然而为了验证,两者都需要事先被双方知道,因为协议不允许交换这些信息(这样做会导致一些鸡鸡和鸡蛋的情况)。例如,如果您考虑一个Javascript客户端,这意味着这两个键都可能是在源代码中定义的常量 - 这使得它们易于获取。所以:为什么要麻烦?仅仅是为了减轻'Eve',因为某些原因,'Eve'没有打扰到JS或客户端源代码,而这些源代码必须公开!?其次,像其他任何认证机制一样,它需要客户端+服务器随机数。

鉴于认证随机数,按照定义,不应该(同一用户至少)使用一次以上,这大概意味着服务器必须维护所有用户使用的所有现时值的记录永远 。与我们经常存档的其他数据不同,这样的表格只会变得越来越大,查询反而会变得越来越慢!

如果这是正确的,那么实施这个或几乎任何其他认证机制在技术上是不可行的!因为我知道这显然是荒谬的;在合理的时间范围内定义一些额外的范围也是常见的。

与认证和加密一样,尽管是一位非常有经验的软件开发人员,我觉得我要回到学校了!我错过了什么!?

回答

2

都需要由双方 提前知道,因为协议不 允许这些交换(这样做 会导致有点鸡和蛋 情景)。

是的,这是正确的。挑战反应不是密钥交换协议。它只是规范,一旦客户端和服务器共享一个密钥,如何通过该密钥计算出相同的值,而不通过网络传输清除密钥。

如果你考虑一个JavaScript客户端, 例如,这意味着这两个键是 可能是在 源定义的常量 - 从而使它们很容易 获取。

这不是一个好主意。或者客户和服务器可以在初步注册过程中就密钥达成一致。

鉴于认证随机数, 按照定义,不应该(由同一 用户至少)使用超过一次 多,这大概意味着一个 服务器必须维护所有 现时值的记录所有用户永远使用 。

NO。应使用伪随机数生成为每个新会话生成一个新的随机数。无论如何,如果攻击者不知道它是否已被使用,那么无论如何都会得到相同的nonce,这是非常不可能的。

+0

嗨@ 0verbose - 我不完全确定nonce事情 - 我读的所有内容都说它必须是唯一的;在这种情况下从未在该用户的身份验证交换期间使用。我也做了一些挖掘;并找到http://www.gnu.org/s/gsasl/coverage/lib/scram/client.c.gcov.frameset.html - GNU一个SCRAM客户端的实现 - 其中客户端密钥和服务器密钥都是' #DEFINEd'作为常量;再次阅读并通过RFC,我不确定关键的知识是否实际上帮助攻击者;因为证据的派生方式。但我可能是错的! – 2011-06-14 10:38:11

+0

@安德拉斯佐尔坦:首先请原谅我可怜的英语,也许我不能很好地解释它。无论如何,关于nonce我从来没有听说过需要存储每个交换nonce。我认为,如果它们是用一个真正的伪随机生成器生成的,它们是好的(也许我错了)。对于那些关注恒定键的东西,我非常肯定它们不能成为一个常量。唾弃你正在使用的加密技术或认证方法的类型(a /对称加密,质询/响应等),需要一个SECRET。如果我知道密钥和密码技术都比没有秘密 – Heisenbug 2011-06-14 12:52:25

+0

如果密钥是一个常数,那么每个人都知道这一点,而且没有秘密。仔细阅读您发布的代码:http://www.gnu.org/s/gsasl/coverage/lib/scram/client.c.gcov.frameset.html。 gsasl_hmac_sha1函数中使用的密钥不是常量(CLIENT_KEY),而是salted_pa​​ssword。 – Heisenbug 2011-06-14 12:57:17

相关问题