Php的用于HTTP基本身份验证的password_hash编码

时间:2015-03-08 13:55:39

标签: passwords php javascript

我的问题:

我需要,通过HTTP进行基本身份验证(客户端无法承受HTTPS)。如果通信没有加密,我不担心。我只是想阻止一些用户嗅探和使用密码(网站仅用于上传照片,而这些照片是公开的。)。

我所拥有的工具箱:

  1. 的Javascript
  2. PHP
  3. Sha512.js
  4. 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?
    

2 个答案:

答案 0 :(得分:1)

我意识到您的客户无法负担标准的HTTPS证书,但老实说,即使是免费的SSL证书也可能比您在此处编写的证书要好得多。

在这种情况下,您所做的只是将浏览器端哈希值作为用户的密码,并且所有人必须做的就是发送匹配的哈希值。如果你决定这样做,你肯定需要在服务器端再次哈希密码,但它仍然不能代替SSL。

更多相关信息:https://crackstation.net/hashing-security.htm

答案 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免费提供证书,无需安排付款。