Passwords Php';用于HTTP基本身份验证的s密码\u哈希编码

Passwords Php';用于HTTP基本身份验证的s密码\u哈希编码,passwords,php,javascript,Passwords,Php,Javascript,我的问题: <?php $password= "password"; echo hash('sha512',$password); //outputs: b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86 ?> 我需要通过HTTP进行基本的身份验证(客户端负担不起HTTPS)。

我的问题:

<?php 
$password= "password";
echo hash('sha512',$password);
//outputs: b109f3bbbc244eb82441917ed06d618b9008dd09b3befd1b5e07394c706a8bb980b1d7785e5976ec049b46df5f1326af5a2ea6d103fd07c95385ffab0cacbc86
?>
我需要通过HTTP进行基本的身份验证(客户端负担不起HTTPS)。所以我不担心通信是否加密。我只是想防止一些用户嗅探和使用密码(网站只用于上传照片,这些照片是公开的)

我可以使用的工具箱:

  • Javascript
  • PHP
  • Sha512.js
  • PHP和JS中的SHA算法相同:

    证据:(?)

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

    所以我的想法是使用
    password\u hash()
    函数作为salt生成器

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

    问题是,无论我做什么,当我散列该函数的输出(密码\u散列)时,我都无法获得相同的输出。这似乎与编码有关

    我想使用
    password\u hash()
    ,因为它已经考虑了很多安全因素:

    Javascript:

    document.getElementById("hiddenField").value
    = JS.sha512("password" +  document.getElementById("publicToken").value);
    
    我将“password\u hash”内容放入另一个隐藏的表单字段,我称之为“publicToken”。无论我做什么,我都无法获得哈希匹配:

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

    我意识到您的客户端负担不起标准的HTTPS证书,但老实说,即使是免费的SSL证书也可能比您在这里编造的证书要好得多

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


    这里有更多信息:

    如果没有公钥加密和验证服务器身份的方法(换句话说,HTTPS),不幸的事实是根本没有办法将通信安全到可接受的水平。我甚至不建议尝试,因为我害怕得到一种虚假的安全感。无论你如何散列和盐,它只会比发送明文密码和琐碎的破译稍微好一点

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

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

    任何经历过建立安全网站的麻烦的人 知道获得证书会有多麻烦。让我们加密 自动消除所有这些痛苦,让网站运营商打开HTTPS 使用单击或shell命令

    当我们在2015年年中加密发布时,为您的站点启用HTTPS 只需安装一小块证书管理 服务器上的软件:

    $sudo apt get安装允许加密

    $lets encrypt example.com

    就这些!马上就要直播了

    Let's Encrypt管理软件将:

    • 自动向Let's Encrypt CA证明您控制了网站
    • 获取浏览器信任证书并在web服务器上进行设置
    • 跟踪证书的到期时间,并自动续订证书
    • 如果有必要,请帮助您吊销证书
    没有验证电子邮件,没有复杂的配置编辑,没有过期 证书破坏了你的网站。当然,因为让我们 Encrypt免费提供证书,无需安排付款


    你好,Dario,您似乎有相互冲突的要求:
    ,所以如果通信未加密,我不担心。我只是想防止一些用户嗅探并使用密码
    。此外,如果JS本身至少没有通过HTTPS提供服务,那么您在JS中所做的任何加密都是毫无价值的。最后,“买不起HTTPS”似乎不可思议,因为有很多非常便宜的证书提供商,甚至可能是免费的。。。这听起来像是一个发明的问题来解决这个问题。你是否考虑过使用已经存在的HTTP摘要访问认证?你假设攻击者不会简单地在登录页面的中间人,剥掉你使用的任何客户端加密或者注入JavaScript键盘记录器。几百兆字节的webiste+数据库和HTTPS?如果你举一个例子,那么这个问题是虚构的,而不是证书的问题。客户端根本负担不起任何托管费用,因此它使用altervista,尽管我可以生成免费证书,但它不提供HTTPS。然后,我将回到计划B,在网站上进行任何操作之前,我将向客户发送带有确认链接的电子邮件(我将使用其网络邮件服务的HTTPS)
    <?php 
    $salt = ut8_encode(password_hash("another_password")); //doesn't work either
    
    <?php
    $salt = //... one time usage salt.. but what to put here?