0

我已经实现了如下所示的多级身份验证。

方括号([ 和 ])表示哈希

客户端具有用于身份验证的密钥秘密。服务器有一个数据库表,其中的行包含一个keysalt和一个[secret + salt]

       Client                                    Server
         |                                          |
         ----------------- key -------------------->| 
         |                                          | 
         |                                          |
         |<--------- server-nonce -------------------
         |<------------ salt ------------------------
         |                                          |
         |                                          |
         ------------ key ------------------------->|
         ------------ client-nonce ---------------->|
         --[c-nonce + s-nonce + [secret + salt]] -->|
         |                                          |

然后服务器根据自己的信息检查收到的散列。

我担心的是,这使攻击者能够从服务器获取盐,然后生成彩虹表来破解该帐户。您对此有何看法?

4

3 回答 3

0

如果连接不安全,并且攻击者设法获得了盐和密码,即使没有彩虹表,他也可以粗暴地破解帐户。

单独的盐\密码是没用的。

算法应该更像是:

client-----pass------>server
client<----noonce----server
                     server--------getSalt---->back-end-service
                     server<-------salt------- back-end-service
                     server-------[pass+salt]->storage
于 2010-02-25T12:31:19.277 回答
0

为什么您需要将盐返回给客户?纯粹是为了保护用户的秘密?无论如何,c-nonce 和 s-nonce 都会被传输,因此只有 [secret + salt] 组合被隐藏。

我的感觉是,如果它是一次性的盐,那就没关系了——你只接受对那个盐的单一响应,如果它失败了,就会生成一个新的盐并再次经历这个过程。这样一来,如果盐被拦截,彩虹表攻击就不可能了,因为它只对第一个请求有效,所以他们需要一个非常幸运的猜测。

您还可以通过使用渐进式超时或有限登录次数等技术来避免这种攻击,这些技术对用户影响很小,但肯定会给任何尝试运行数百次登录尝试的自动化工具带来问题。如果安全性对您很重要,这可能还是值得实施的。

于 2010-02-25T12:27:22.123 回答
0

你是对的。如果攻击者知道系统是这样工作的,就有机会捕获数据并破解。它不安全。

当有许多其他系统(SSL、公钥认证等)没有这些陷阱时,我不明白你为什么要走这条路。

于 2010-02-25T12:27:47.883 回答