我已经实现了下面所示的多级身份验证。
括号(和)表示散列。
客户端具有用于身份验证的密钥和机密。服务器有一个数据库表,其中包含一个键、salt和一个机密+ salt
Client Server
| |
----------------- key -------------------->|
| |
| |
|<--------- server-nonce -------------------
|<------------ salt ------------------------
| |
| |
------------ key ------------------------->|
------------ client-nonce ---------------->|
--[c-nonce + s-nonce + [secret + salt]] -->|
| |
然后,服务器根据自己的信息检查接收到的散列。
我担心的是,这使得攻击者能够从服务器获取盐,然后生成一个彩虹表来攻击该帐户。你对此有何看法?
发布于 2010-02-25 04:27:47
你是对的。如果攻击者知道系统是这样工作的,就有机会捕获数据并破解。它不安全。
当有许多其他系统(SSL、公钥身份验证等)没有这些缺陷时,我不明白为什么要走这个路线。
发布于 2010-02-25 04:27:22
你为什么需要盐才能回到客户身边?纯粹是为了保护用户的秘密?C-农和s-农无论如何都是传输的,所以只有秘密+盐组合才是隐藏的。
我的感觉是,如果它是一次盐,它不应该重要-你只接受一个单一的反应与该盐,如果它不能产生一个新的盐,并再次经历这个过程。这样,如果盐被截获,彩虹表攻击是不可能的,因为它只对第一个请求有效,所以他们需要一个非常幸运的猜测。
您还可以通过使用渐进式超时或有限登录数等技术来避免这种攻击,这些技术对用户影响很小,但肯定会给任何试图运行数百次登录尝试的自动化工具带来问题。如果安全性对您很重要,那么这可能是值得实现的。
发布于 2010-02-25 04:31:19
如果连接不安全,并且攻击者设法将手放在salt和密码上,即使没有彩虹表,他也可以恶意侵入该帐户。
仅使用salt \密码是无用的。
水藻应该更像:
client-----pass------>server
client<----noonce----server
server--------getSalt---->back-end-service
server<-------salt------- back-end-service
server-------[pass+salt]->storage
https://stackoverflow.com/questions/2333869
复制相似问题