通过UTF-8编码套接字传输发送密码时,如果在发送数据之前使用MD5或SHA-1散列密码,它是否安全?请记住,我计划比较SQL数据库中的散列密码。我担心有人能够以UTF-8嗅探哈希密码,然后解密UTF-8编码,并且可以获得我的哈希密码,该密码可能用于匹配我数据库中的密码。
答案 0 :(得分:12)
如果客户端只发送散列密码,则散列密码 是“密码”:客户端只需要显示以进行身份验证的字节序列。如果攻击者可以嗅探那么你的协议就注定了。
如果身份验证协议只包含一条秘密数据(如果您愿意,可以将其称为密码),那么交换应该在传输介质中进行,以确保机密性(以便秘密数据无法被嗅探)和服务器身份验证(以便攻击者可能无法模仿服务器并诱使客户端向他发送秘密数据)。这是您从经典的SSL / TLS隧道(Web上下文中的https://
URL)中获得的。
如果您无法使用服务器身份验证建立SSL / TLS隧道(即服务器具有客户端可以验证的证书),那么您可能需要采用带有质询的身份验证协议:服务器发送一系列随机bytes(挑战),客户端使用通过密码和挑战的串联计算的哈希值进行响应。不要在家尝试做这个!要做到这一点非常困难,尤其是当攻击者可以拦截通信(主动攻击)时。
更通用的答案是password-authenticated key exchange协议。 PAKE结合了加密密钥协商协议(如Diffie-Hellman)和客户端与服务器之间的相互密码身份验证,即使密码相对较弱,攻击者也无法获得足够的数据来“尝试”密码,无需与客户端或服务器进行每次猜测的交互)。不幸的是,很少有PAKE算法被标准化,超出了数学描述,并且该领域是专利雷区。
答案 1 :(得分:4)
好吧,如果有人可以嗅探哈希 - 他可以伪造授权请求并发送他已经知道的哈希。
构建安全系统并不容易,您需要使用带有正确签名密钥的非对称加密技术进行授权,以确保其安全。
至少添加~100byte的随机盐,并使用SHA1 - 这样就会更难以暴力破解。
答案 2 :(得分:1)
如果他们知道哈希算法,他们就可以强制使用你的密码。简单(并且不是非常安全)的解决方案是使用质询/响应,服务器发出随机字符串(“nonce”)以与密码哈希一起进行哈希处理。这使您的应用程序无法应对您所描述的那种重播攻击。
有关详细信息,请参阅HTTP的digest access authentication
答案 3 :(得分:0)
如何检查数据库端的密码?
如果您存储密码的未加盐的哈希值并将其与输入进行比较,则可以嗅探并重复使用哈希密码。
就像您将密码本身以纯文本形式存储在数据库中一样。
如果您害怕嗅探,请使用质询 - 响应协议进行身份验证,但在这种情况下,秘密将存储在数据库中(任何有权访问数据库的人都知道)。
或者,您可以通过受保护的频道(SSL
)以纯文本形式发送密码,但是您必须安装一个很可能会花费您一些钱的证书(如果您使用的权限来自供应商提供的列表,即客户浏览器不会抱怨的列表)
答案 4 :(得分:0)