我的问题:
我需要,通过HTTP进行基本身份验证(客户端无法承受HTTPS)。如果通信没有加密,我不担心。我只是想阻止一些用户嗅探和使用密码(网站仅用于上传照片,而这些照片是公开的。)。
我所拥有的工具箱:
SHA和JS中的SHA算法相同:
证据:(?)
<?php
$password= "password";
echo hash('sha512',$password);
//outputs: b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86
?>
在JS中(我的所有文件都是用utf8编码的)
document.getElementById("hiddenField").value
= JS.sha512("password");
//outputs b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86
但是我不能简单地在每个连接上发送相同的哈希值,否则任何人都可以嗅探它并将其发送到连接。
所以我的想法是使用password_hash()
函数作为salt生成器。
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?
答案 0 :(得分:1)
我意识到您的客户无法负担标准的HTTPS证书,但老实说,即使是免费的SSL证书也可能比您在此处编写的证书要好得多。
在这种情况下,您所做的只是将浏览器端哈希值作为用户的密码,并且所有人必须做的就是发送匹配的哈希值。如果你决定这样做,你肯定需要在服务器端再次哈希密码,但它仍然不能代替SSL。
答案 1 :(得分:1)
如果没有公钥加密和验证服务器身份的方法(换句话说,HTTPS),不幸的事实是没有办法确保通信达到可接受的水平。我甚至不建议尝试,因为害怕得到一种虚假的安全感。无论你有多少哈希和盐,它只会比发送明文密码和琐碎的破解更好。
如果您的客户买不起证书,我建议您查看StartSSL。他们的基础证书是完全免费的;我相信它们有效期为1年,无限续订。
另一个值得关注的项目是Let's Encrypt。他们试图使获得证书的过程更加简单和易于访问,因此他们开发了一种方法来完全自动化颁发(免费)证书的过程。不幸的是,该服务尚未生效;他们计划今年夏天开始颁发证书。引用他们的页面:
任何人都遇到了建立安全网站的麻烦 知道获得证书的麻烦是什么。我们加密吧 自动化所有这些痛苦,让网站运营商打开HTTPS 只需单击或shell命令。
当Let's Encrypt在2015年中期启动时,为您的网站启用HTTPS 就像安装一小段证书管理一样简单 服务器上的软件:
$ sudo apt-get install lets-encrypt
$ lets-encrypt example.com
这就是它的全部! https://example.com立即生效。
Let的加密管理软件将:
- 自动向您控制网站的Let's Encrypt CA证明
- 获取浏览器信任的证书并在Web服务器上进行设置
- 跟踪证书何时到期,并自动续订
- 如果有必要,请帮助您撤销证书。
没有验证电子邮件,没有复杂的配置编辑,没有过期 证书打破了你的网站。当然,因为我们 Encrypt免费提供证书,无需安排付款。