3

大家,早安。我一直在阅读(大部分都在堆栈溢出中)关于如何进行安全密码身份验证(散列 n 次,使用 salt 等),但我不确定如何在我的 TCP 客户端中实际实现它-服务器架构。

我已经实现并测试了我需要的方法(使用 jasypt digester),但我怀疑在哪里进行散列及其验证。

至于我阅读的内容,一个好的做法是避免传输密码。在这种情况下,服务器将发送散列密码,客户端将使用用户输入的密码对其进行测试。之后,我必须告诉服务器身份验证是否成功。好的,这行不通,因为任何连接到服务器正在读取的套接字并发送“authentication ok”的人都将登录。

另一种选择是将密码发送到服务器。在这种情况下,我看不到散列有任何实际好处,因为“攻击者”将不得不发送相同的散列来进行身份验证。

可能我没有得到一些细节,所以,任何人都可以告诉我这个吗?

4

1 回答 1

2

对您的问题的简短回答肯定是永久存储密码的哈希值

长答案:散列密码只允许防止对您的密码存储(例如数据库)具有只读访问权限的攻击者升级到更高的功率级别,并防止您知道实际的秘密密码,因为许多用户使用相同的密码跨越多个服务(这里这里都有很好的描述)。这就是您需要在存储端进行验证的原因(因为否则,正如您所提到的,攻击者只会发送“validation ok”消息,仅此而已)。

但是,如果您想实现真正安全的连接,简单的密码散列是不够的(正如您还提到的,攻击者可以嗅探 TCP 流量并揭示散列)。为此,您需要建立一个安全连接,这比散列密码要困难得多(在网络世界中,您输入通行证的页面应始终通过 HTTPS 提供)。SSL/TLS 应该用于此,但是这些协议位于 TCP 之上,因此您可能需要另一种解决方案(通常,您需要有一个受信任的证书源,需要验证服务器证书,需要生成一个通用的对称加密密钥,然后加密您发送的所有数据)。建立安全加密连接后,加密数据无法嗅探,攻击者永远不会知道密码的哈希值。

于 2013-09-02T14:23:25.610 回答