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

标签 tcp client-server password-protection password-encryption

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

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

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

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

可能我没有得到一些细节,所以,任何人都可以给我一些启发吗?

最佳答案

对您的问题的简短回答肯定是站在永久存储密码散列的一边

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

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

关于tcp - TCP 客户端服务器架构中的简单密码验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18575002/

相关文章:

java - 代码: Java Transfer File over TCP的效率

java - 在 Java 中从传入字符串创建文件

java - 使用 POST 请求将值从 HTTP 客户端发送到 HTTP 服务器,用 Java 编码

Javascript 密码保护区..一定是更好的方法

php - ZIP 文件并用 PHP 密码保护

c# - 无需端口转发的 UDP/TCP 发送和接收

tcp - 当我们将 TCP 监听器安装为 Win 服务时,防火墙会阻止 TCP 服务

java - 在socket编程中如何判断服务器发送数据成功?

android - 将所选图像转换为字节数组并转换为字符串

java - 数据库中存储密码的加密方法