Security 我应该在将密码发送到服务器端之前对其进行哈希吗?

Security 我应该在将密码发送到服务器端之前对其进行哈希吗?,security,authentication,login,https,Security,Authentication,Login,Https,我注意到大多数网站都会通过HTTPS将密码以明文形式发送到服务器。如果我将密码的哈希值发送到服务器,有什么好处吗?它会更安全吗?不,事实上这是一个漏洞。如果攻击者能够从数据库中获取哈希,那么他可以使用它进行身份验证,而无需破解它。在任何情况下,用户或攻击者都不能获取哈希密码 对密码进行哈希处理的全部目的是增加一层额外的安全性。如果攻击者能够使用SQL注入或不安全的备份从数据库中获取哈希和salt,那么他必须通过暴力强制来查找纯文本。常用于破解咸密码散列 不使用https违反了OWASP前10条:

我注意到大多数网站都会通过HTTPS将密码以明文形式发送到服务器。如果我将密码的哈希值发送到服务器,有什么好处吗?它会更安全吗?

不,事实上这是一个漏洞。如果攻击者能够从数据库中获取哈希,那么他可以使用它进行身份验证,而无需破解它。在任何情况下,用户或攻击者都不能获取哈希密码

对密码进行哈希处理的全部目的是增加一层额外的安全性。如果攻击者能够使用SQL注入或不安全的备份从数据库中获取哈希和salt,那么他必须通过暴力强制来查找纯文本。常用于破解咸密码散列

不使用https违反了OWASP前10条:

编辑: 如果在您的实现中计算一个
sha256(客户端\u salt+纯文本\u密码)
,然后在服务器端计算另一个散列
sha256(服务器\u salt+客户端\u散列)
,则这不是一个严重的漏洞。但是,它仍然容易被窃听和重播请求。因此,这仍然是对WASP A9的明显违反。但是,这仍然使用消息摘要作为安全层


我见过的最接近于客户端https替代品的是一个。然而,这确实阻止了主动MITM攻击,因此在技术上违反了OWASP A9。代码的作者同意,这不是HTTPS的完全替代品,但是它总比没有好,也比客户端哈希系统好

因为它是通过HTTPS发送的,所以发送密码时不需要散列(在HTTPS上它不是纯文本)。此外,如果您的应用程序依赖HTTPS来保证其内容的安全,那么在通过HTTPS发送密码之前对密码进行散列是没有用的(即,如果攻击者可以在线路上对数据进行解密,那么您无论如何都会被攻破)

实际上,对密码进行散列并通过非加密通道发送密码是不安全的。您将在客户端上公开哈希算法。黑客可以嗅出密码的散列信息,然后用它在以后入侵


通过使用HTTPS,您可以防止黑客从单一来源获取密码,因为HTTPS使用两个通道,都是加密的。

如果您连接到HTTPS服务器,则服务器和浏览器之间的数据流应该加密。数据在发送前和接收后仅为纯文本

使用HTTP摘要-它甚至可以通过HTTP保护密码(但最好使用https上的HTTP摘要)

维基百科:

HTTP摘要访问身份验证是web服务器可用于与web用户协商凭据(使用HTTP协议)的商定方法之一。摘要身份验证旨在取代基本访问身份验证的未加密使用,允许安全地建立用户身份,而无需通过网络发送明文密码。摘要身份验证基本上是MD5加密哈希的一个应用程序,它使用nonce值来防止密码分析。 链接:

如果您想看到“真实生活”中的使用,可以查看phpMyID—一个使用http摘要身份验证的php openid提供程序

。。或者您可以从以下位置的php auth示例开始

Http摘要rfc:


根据我的测试,所有现代浏览器都支持它…

通过网络发送哈希完全违背了哈希的目的,因为攻击者只需发送哈希并忘记密码即可。简而言之,在明文中使用哈希的系统是完全开放的,只需网络嗅探就可以了。

如果你想用HTTP上的哈希密码替换HTTPS上的明文密码,那你就是自找麻烦。HTTPS在打开通信通道时生成一个随机的共享事务密钥。这很难破解,因为您几乎只限于强制执行用于(相对)短期事务的共享密钥。而你的散列可以只是嗅探,离线,在彩虹表中查找,或者只是在很长一段时间内强制执行


但是,通过HTTPS发送的基本客户端密码混淆(不是散列)确实有一些价值。如果我没有弄错的话,一些银行实际上使用了这种技术。这种技术的目的不是为了保护密码不被窃听。相反,这是为了阻止密码被愚蠢的间谍工具和浏览器插件使用,这些工具和插件只会抓取他们看到的每个HTTPS GET/POST请求。我看到从恶意网站捕获的日志文件是从用户会话捕获的400MB随机GET/POST事务。你可以想象,只使用HTTPS的网站会在日志中显示明文密码,但使用非常基本的混淆(ROT13)的网站也会显示不立即使用的密码。

这是一个老问题,但我觉得有必要就这一重要问题提供我的意见。这里有太多的错误信息

OP从未提及通过仅HTTP的HTTPS发送明文密码,但许多人似乎出于某种原因对通过HTTP发送密码的问题做出了回应。也就是说:

我认为密码永远不应该以明文形式保留(更不用说传输了)。这意味着不能保存在磁盘上,甚至不能保存在内存中

在这里回应的人似乎认为HTTPS是一颗银弹,但事实并非如此。但是,它确实非常有用,应该在任何经过身份验证的会话中使用

真的不需要知道原始密码是什么。所需要的只是一种基于用户选择的原始文本生成(并可靠地重新生成)身份验证“密钥”的可靠方法。我