PHP 的 HTTP 基本身份验证的password_hash编码

Php's password_hash encoding for HTTP basic authentication

本文关键字:hash 编码 password HTTP PHP 身份验证      更新时间:2023-09-26

我的问题:

我需要通过HTTP进行基本身份验证(客户端负担不起HTTPS)。所以我不担心通信是否未加密。我只是想防止某些用户嗅探和使用密码(网站仅用于上传照片,这些照片是公开的。

我可以使用的工具箱:

  1. 爪哇语
  2. .PHP
  3. 沙512.js

SHA 算法在 PHP 和 JS 中是相同的:

证据:(?

<?php 
$password= "password";
echo hash('sha512',$password);
//outputs: b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86
?>

在JS中(我的所有文件都用utf8编码)

document.getElementById("hiddenField").value
= JS.sha512("password");
//outputs b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86

但是,我不能简单地在每个连接上发送相同的哈希值,否则任何人都可以嗅探它并将其发送到连接。

所以我的想法是使用password_hash()功能作为盐发生器。

salt是公共的,(

password+salt)的哈希是公共的,但密码是私有的,永远不会以明文形式发送:服务器将从客户端计算(希望)与JS中的哈希相同的哈希,并验证两个哈希是否匹配。

问题是,无论我做什么,当我对该函数的输出进行哈希处理时,我都无法获得相同的输出(password_hash)。这似乎与编码有关。

我想使用password_hash()因为它已经考虑了很多安全的东西:

Javascript:

document.getElementById("hiddenField").value
= JS.sha512("password" +  document.getElementById("publicToken").value);

我将"password_hash"内容放入另一个隐藏的表单字段中,我称之为"publicToken"。无论我做什么,我都无法获得哈希匹配:

<?php 
$salt = ut8_encode(password_hash("another_password")); //doesn't work either

最后,我该怎么做才能获得正确编码的盐?

<?php
$salt = //... one time usage salt.. but what to put here?

我知道您的客户买不起标准的HTTPS证书,但老实说,即使是免费的SSL证书也可能比您在这里炮制的要好得多。

在这种情况下,您所做的只是使浏览器端哈希成为用户的密码,而进入所要做的就是发送匹配的哈希。如果您决定这样做,您肯定需要在服务器端再次对密码进行哈希处理,但它仍然不能替代 SSL。

更多关于它的信息在这里: https://crackstation.net/hashing-security.htm

如果没有公钥加密和验证服务器身份的方法(换句话说,HTTPS),不幸的事实是根本没有办法将通信保护到可接受的水平。我什至不建议尝试,因为害怕获得虚假的安全感。无论您进行多少哈希和盐处理,它都只能比发送明文密码和微不足道的破解要好。

如果您的客户买不起证书,我建议您看看StartSSL。他们的基本水平证书是完全免费的;我相信它们的有效期为 1 年,可无限续订。

另一个值得关注的项目是Let's Encrypt。他们试图使获取证书的过程更简单、更易于访问,因此他们开发了一种完全自动化颁发(免费)证书过程的方法。不幸的是,该服务尚未上线;他们计划今年夏天开始颁发证书。引用他们的页面:

任何经历过建立安全网站的麻烦的人知道获得证书是多么麻烦。让我们加密自动消除所有这些痛苦,并允许网站运营商打开HTTPS只需单击一下或外壳命令。

当Let's Encrypt在2015年年中推出时,为您的网站启用HTTPS就像安装一小块证书管理一样简单服务器上的软件:

$ sudo apt-get install lets-encrypt

$ lets-encrypt example.com

这就是它的全部内容! https://example.com 立即上线。

Let's Encrypt管理软件将:

  • 自动向Let's Encrypt CA证明您控制了该网站
  • 获取受浏览器信任的证书并在您的 Web 服务器上进行设置
  • 跟踪证书何时过期,并自动续订
  • 如有必要,请帮助您吊销证书。
没有

验证电子邮件,没有复杂的配置编辑,没有过期证书破坏您的网站。当然,因为让我们加密免费提供证书,无需安排付款。