【发布时间】:2015-05-09 21:55:40
【问题描述】:
我的问题:
我需要基于 HTTP 的基本身份验证(客户端无法承受 HTTPS)。所以我不担心通信是否没有加密。我只是想防止某些用户嗅探和使用密码(网站仅用于上传照片,这些照片是公开的。)。
我可以使用的工具箱:
- Javascript
- PHP
- Sha512.js
PHP 和 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 是公开的,(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?
【问题讨论】:
-
嗨达里奥,你似乎有冲突的要求:
So I don't warry If communication is not crypted. I just want to prevent some user can sniff and use the password。此外,如果 JS 本身至少不是通过 HTTPS 提供的,那么您在 JS 中所做的任何加密都是毫无价值的。最后,“买不起 HTTPS”似乎非常奇怪,因为有很多非常便宜的证书提供者,甚至可能是免费的......这听起来像是一个解决解决方案的发明问题。 -
您是否考虑过使用已经存在的 HTTP 摘要式访问身份验证?
-
您假设攻击者不会简单地进入登录页面的中间并剥离您使用的任何客户端加密或注入 JavaScript 键盘记录器。
-
任何允许存储数百兆的 webiste + 数据库和 HTTPS 的免费 Web 服务示例?如果你举个例子,那么问题是发明的,否则不是
标签: passwords php javascript