TCP客户端服务器架构中的简单密码认证

3
大家早上好。我一直在阅读(大部分在这里的堆栈溢出)有关如何进行安全密码身份验证(哈希n次,使用盐等)的内容,但我怀疑我该如何在我的TCP客户端-服务器架构中实际实现它。
我已经实现并测试了我需要的方法(使用jasypt摘要),但我的疑问是在哪里进行哈希及其验证。
据我所读,一个好的实践是避免传输密码。在这种情况下,服务器将发送哈希密码,客户端将使用用户输入的密码进行测试。之后,我必须告诉服务器身份验证是否成功。好的,这行不通,因为连接到服务器正在读取的套接字的任何人都可以发送“身份验证通过”并被记录。
另一个选择是向服务器发送密码的哈希结果。在这种情况下,我没有看到任何实际的散列好处,因为“攻击者”只需发送相同的哈希结果即可进行身份验证。
也许我没有理解一些细节,那么,有人能给我指点吗?
1个回答

2
您的问题的简短答案是“绝对是永久存储密码哈希值的一侧”。
长答案:仅对密码进行哈希处理只能防止具有只读访问权限的攻击者(例如数据库)升级到更高的权限级别,并且防止您知道实际的秘密密码,因为很多用户在多个服务中使用相同的密码(可以在此处找到良好的描述herehere)。这就是为什么您需要在存储端进行验证(否则,如您所提到的,攻击者将只需发送“验证通过”消息即可)。
然而,如果您想要实现真正安全的连接,简单的密码哈希是不够的(正如您所提到的,攻击者可以嗅探TCP流量并揭示哈希)。为此,您需要建立一个安全连接,这比仅仅哈希密码要困难得多(在Web世界中,输入密码的页面应始终通过HTTPS提供)。 SSL / TLS应该用于此,但这些协议位于TCP之上,因此您可能需要另一种解决方案(通常需要有一个受信任的证书源,需要验证服务器证书,需要生成一个公共对称加密密钥,然后加密您发送的所有数据)。在建立了安全的加密连接之后,加密数据对于嗅探来说是无用的,攻击者永远不会知道密码的哈希值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接