PHP 的 HTTP 基本身份验证的password_hash编码
Php's password_hash encoding for HTTP basic authentication
我的问题:
我需要通过HTTP进行基本身份验证(客户端负担不起HTTPS)。所以我不担心通信是否未加密。我只是想防止某些用户嗅探和使用密码(网站仅用于上传照片,这些照片是公开的。
我可以使用的工具箱:
- 爪哇语
- .PHP
- 沙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()
功能作为盐发生器。
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 服务器上进行设置
- 跟踪证书何时过期,并自动续订
- 如有必要,请帮助您吊销证书。
验证电子邮件,没有复杂的配置编辑,没有过期证书破坏您的网站。当然,因为让我们加密免费提供证书,无需安排付款。
- 将地理编码结果转换为php变量以发布到mysql数据库
- Json在完整日历中对数据进行了编码
- 如何对每个用户每天只允许单击一次的按钮进行编码
- Javascript字符集编码
- 如何在javascript转换编码中将一个动态值从一个表单添加到另一个页面
- base64编码的图像比intranet中的常规图像好吗
- 我不知道我的编码有什么问题.(JavaScript)
- 为什么字符编码对URL很重要
- 如何在做PHP时在base64中动态编码;preg_ replace”;
- 如何将JSON编码的PHP数组发送到同一页面上的数据表
- 如何使Jquery编码的动态下拉菜单与PHP GET变量协调工作
- JavaScript代码,用于在浏览器中显示字节数组中的PDF文件(非base64编码)
- 以HTML文件中的编码形式脱机存储图像
- 从Base64 Ionic编码和解码图像
- 错误编码的Adsense广告正在扼杀我的网站's的性能
- 如何在JS中编码URL并在PHP中解码
- 使用php在html中搜索硬编码的JavaScript变量
- 如何在JavaScript/Node中计算SHA256哈希和Base64字符串编码
- Wordpress最佳实践编码/精简模板
- Json在js中对数据循环进行编码