将密码哈希化后发送到服务器

5
当通过UTF-8编码的套接字传输发送密码时,如果我在发送数据之前使用MD5或SHA-1哈希密码,是否被认为是安全的?请注意,我计划在SQL数据库中比较哈希密码。我担心有人能够嗅探UTF-8中的哈希密码,然后解密UTF-8编码,并可能获得我的哈希密码,从而匹配我的数据库中的密码。

使用SSL并将服务器证书与嵌入程序中的哈希值进行比较。 - CodesInChaos
5个回答

13
如果客户端只发送哈希密码,那么哈希密码就是“密码”:客户端只需要展示它以进行身份验证的一系列字节。如果攻击者能够嗅探到这个密码,那么您的协议就注定要失败。
如果身份验证协议仅包括呈现秘密数据(如果您愿意,称之为密码),则交换应在确保机密性(使秘密数据无法被嗅探)和服务器身份验证(以便攻击者不能模仿服务器并说服客户端将秘密数据发送给他)的传输介质中进行。这就是经典SSL / TLS隧道(Web上下文中的https:// URL)所提供的内容。
如果您无法与具有可由客户端验证的证书的服务器建立SSL / TLS隧道,则可能需要采用具有挑战的身份验证协议:服务器发送一系列随机字节(挑战),客户端响应计算出的哈希值,该哈希值基于密码和挑战的串联。不要在家里尝试这样做!正确地执行此操作非常困难,特别是当攻击者可以拦截通信(主动攻击)时。
更通用的答案是password-authenticated key exchange协议。PAKE结合了密码学密钥协商协议(例如Diffie-Hellman)和客户端和服务器之间的相互密码身份验证,以一种方式击败了被动和主动攻击者,即使使用相对较弱的密码(攻击者无法获取足够的数据来“尝试”密码,而不与客户端或服务器交互进行每次猜测)。不幸的是,除了数学描述外,很少有PAKE算法被标准化,并且该领域是一个专利雷区。

C++ Qt 中是否有一个适当使用挑战认证的库? - sonics876

4

如果有人能嗅探哈希值,他就可以伪造授权请求并发送他已知的哈希值。

建立安全系统并不容易,您需要使用正确签名的非对称加密进行授权才能使其变得安全。

至少要添加100字节的随机盐,并使用SHA1 - 这样会更难破解。


1
在2017年,SHA1不再是一种加密哈希算法。 - mauris

1
如果攻击者知道哈希算法,他们可以使用暴力破解来获取您的密码。简单(但不完全安全)的解决方案是改用挑战/响应方式,即服务器发出一个随机字符串(“nonce”),与密码哈希一起进行哈希运算。这使得您的应用程序免受您所描述的重放攻击的影响。
有关更多信息,请参见HTTP的摘要访问认证

0

如何在数据库端检查密码?

如果您存储的是未加盐哈希密码,并将其与输入进行比较,则可以嗅探并重复使用哈希密码。

这就像您在数据库中以明文形式存储密码本身一样。

如果您担心嗅探攻击,请使用挑战-响应协议进行身份验证,但在这种情况下,密钥将存储在数据库中(并且任何有权访问数据库的人都将知道该密钥)。

或者,您可以通过受保护的通道(SSL)以明文形式发送密码,但您必须安装证书,这很可能会花费一些金钱(如果您使用供应商提供的列表中的授权机构,即您的客户浏览器不会抱怨的授权机构)。


0

嗯,如果你在谈论“适当”的哈希,那意味着它会“加密”你的密码,使其无法解密,因为哈希是单向函数,要解密它需要一些时间和某种强大的CPU计算能力

如果你担心密码嗅探器,可以采取下一步 - 使用私钥/公钥加密。服务器应向客户端发送挑战(用于加密的公钥),客户端使用它进行加密,只有服务器知道如何解密。对于相同数量的位,它提供更多的保护 - 即需要更多的计算能力才能破解它。

查看this


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