我已实施下图所示的多级认证。
括号([和])表示哈希
客户端使用密钥和密钥进行身份验证。服务器有一个数据库表,其中的行包含键, salt 和 [secret + salt]
Client Server
| |
----------------- key -------------------->|
| |
| |
|<--------- server-nonce -------------------
|<------------ salt ------------------------
| |
| |
------------ key ------------------------->|
------------ client-nonce ---------------->|
--[c-nonce + s-nonce + [secret + salt]] -->|
| |
然后,服务器根据自己的信息检查收到的哈希值。
我担心这会让攻击者从服务器获取盐,然后生成彩虹表来破解该帐户。你对此有何看法?
答案 0 :(得分:0)
为什么你需要盐回到客户端?纯粹是为了保护用户的秘密? c-nonce和s-nonce都是传输的,所以它只是隐藏的[secret + salt]组合。
我的感觉是,如果它是一次性的盐,那么无关紧要 - 你只接受一次盐的单一反应,如果它失败则产生一种新盐并再次经历这个过程。这样一来,如果盐被截获就不可能进行彩虹表攻击,因为它只对第一个请求有效,所以他们需要一个非常幸运的猜测。
您还可以通过使用渐进式超时或有限登录号码等技术来避免此类攻击,这些技术对用户的影响非常小,但对于尝试运行数百次登录尝试的任何自动化工具肯定会出现问题。如果安全对您很重要,那么这可能值得实施。
答案 1 :(得分:0)
我不明白为什么在没有这些陷阱的许多其他系统(SSL,公钥认证等)时你会走这条路。
答案 2 :(得分:0)
如果连接不安全,并且攻击者设法获取盐和密码,即使没有彩虹表,他也可以狡猾地破解帐户。
单独使用盐\密码是没用的。 algorithem应该更像是:client-----pass------>server
client<----noonce----server
server--------getSalt---->back-end-service
server<-------salt------- back-end-service
server-------[pass+salt]->storage