Plain text password over HTTPS

我目前正在开发一个基于 HTTPS 的 PHP OpenID 提供程序(因此加密了 SSL)。
对我来说,以纯文本形式传输密码是 错了吗?HTTPS 在理论上,不能被拦截,所以我看不出有什么问题。还是说这在某种程度上是不安全的,而我却没有看到这一点?

64971 次浏览

如果 HTTP 被禁用,而您 only使用 HTTPS,那么您实际上并没有以纯文本的形式传输密码。

很安全。整个网络就是这么运作的。表单中的所有密码总是以纯文本形式发送,因此要由 HTTPS 来保护它。

您仍然需要确保通过 POST 请求而不是 GET 发送它。如果通过 GET 请求发送,则可以将其明文保存在用户的浏览器历史记录日志或 Web 服务器的访问日志中。

The other posters are correct. Now that you're using SSL to encrypt the transmission of the password, make sure you're hashing it with a good algorithm and salt so it's protected when it's 休息, too...

散列客户端,怎么了? 让我告诉你一个小实验。 走到公司食堂的电脑前,打开浏览器进入公司网站登录页面(https)。 按 F12,单击网络标签,勾选持久日志,最小化控制台,但保持网页打开登录页面。 坐下来吃午饭。看着员工一个接一个地登录公司网站,做个好员工。 Finish lunch, sit down at computer bring up network tab and see every single username and password in plain text in the form bodys.

No special tools, no special knowledge, no fancy hacking hardware, no keyloggers just good old F12.

But hey, keep thinking all you need is SSL. The bad guys will love you for it.

让我们对以前的答案做一些笔记。

首先,使用哈希算法客户端可能不是最好的主意,因为如果你的密码在服务器端是盐,你将无法比较哈希(至少如果你不存储在数据库中的哈希客户端哈希层的密码,这是相同的或更糟)。而且您不想在客户端实现数据库使用的哈希算法,这将是愚蠢的。

其次,交换密钥也不理想。MITM 理论上可以(考虑到他在客户机上安装了 root 证书)更改加密密钥,并使用他自己的密钥进行更改:

来自交换密钥的理论服务器的原始连接(不考虑 TLS)的示例:

客户端请求公钥 > 服务器保存私钥,生成公钥给客户端 > 服务器发送公钥给客户端

现在,在一个理论上的 MITM 攻击中:

客户端请求公钥 > MITM 生成假的私钥 > 服务器持有私钥,生成公钥给客户端 > MITM 接收来自原始服务器的公钥,现在,我们可以自由地将假公钥发送给客户端,每当来自客户端的请求时,我们将使用假密钥解密客户端数据,更改负载(或读取) ,并使用原始公钥进行加密 > MITM 向客户端发送假公钥。

这就是在 TLS 中拥有可信 CA 证书的意义所在,也是如何在证书无效时接收来自浏览器的警告消息的方式。

作为对 OP 的回应: 在我看来,您不能这样做,因为迟早会有人想要从您的服务攻击用户,并试图破坏您的协议。

但是,您可以做的是实现2FA,以防止人们尝试使用相同的密码登录。不过要小心重播攻击。

我不擅长密码学,如果我错了请纠正我。

@ CodeDog 的例子有问题. 。

是的,我可以相信用户将登录到一个咖啡厅框。如果你是从公司的咖啡厅获取日志,那么 就是安全漏洞。公司的咖啡机盒应该被禁用,例如没有条款,没有记录器,没有远程访问等。为了防止你,内部黑客。

这个例子是一个很好的计算机访问安全的例子,与网络安全并不真正相关。它是作为客户端散列的理由提供的,但是如果您有计算机访问权限,您可以只使用按键记录器并绕过它。客户端散列也是不相关的。@ CodeDog 的例子是一个计算机访问黑客,需要不同于网络层黑客的技术。

此外,如上所述,公共计算机黑客通过使系统免受威胁而受到保护。例如,在公共咖啡厅的电脑上使用 Chromebook。但 身体上的黑客已经绕过了这一步。在休息时间,去咖啡厅安装一个秘密摄像头来记录用户的键盘按键。那么如果咖啡馆的计算机瘫痪了,或者使用了什么类型的加密,这些都不重要了。

物理层-> 计算机层-> 客户端层-> 网络层-> 服务器层

对于网络来说,如果在客户端进行散列并不重要,因为 https/ssl 层将加密普通的 passwd。因此,正如其他人提到的,如果 TLS 是安全的,那么客户机散列就是多余的。