4

我知道,出于安全原因,有必要对用户的密码进行散列(使用盐)并将其与存储的散列密码进行比较,因此如果其他人获得散列字符串,他将无法计算回密码或查看把它放在彩虹桌上。

该方法有一部分我不明白。假设我有这个标准的登录表单

<form method='post' action='login.php'>
    <input type='text' name='user' />
    <input type='password' name='password' />
    <input type='submit' name='submit' value='login' />
</form>

然后我使用 PHP 登录

<?php
    if(isset($_POST['submit'])){
        $username = $_POST['username'];
        $password = sha1($_POST['password']);
        $authorize = $login_object->login($username, $password);
    }
?>

并且,在幕后,$login_object负责对数据库进行身份验证并返回真/假。(我做了这个对象,我有真正有用的对象来做这个)

但这意味着POST request原始旅行中的密码,未经哈希处理且不安全!任何人都可以截获真正的密码!

所以我在想的是我应该在发送密码之前使用javascript对密码进行哈希处理。我将有一个隐藏字段<input type='hidden' name='real_password' value='' />并让 javaScript 复制名为密码的输入的值,对其进行哈希处理,将其放入 real_password 隐藏输入中并将密码字段空白。这样,POST request将拥有散列密码,而不是原始的、不安全的原始密码。

我对我所说的是否正确,或者我应该只对 php 进行哈希处理?

4

3 回答 3

6

散列可以保护服务器端的数据。要保护到服务器的数据流,请使用 HTTPS。在这方面,密码或其哈希是否在网络上被盗(并随后被复制)没有区别。HTTPS 还授予证书以确保在用户的浏览器中显示挂锁(切记不要在未经适当认证的页面中输入重要密码)。

于 2012-11-08T02:08:22.543 回答
3

我的评论,作为答案;)

如果您使用 Javascript 对密码进行哈希处理,那么登录所需的实际密码将成为哈希密码,该密码仍然通过原始网络传输且未加密。要将密码从用户的浏览器安全地传输到您的服务器,您需要使用 SSL。

于 2012-11-08T02:12:29.627 回答
3

正如许多评论者所说,安装 SSL 证书将防止任何窃听,因此您不必担心。通过 HTTP 发送它是未加密的,并且容易被窃听,尤其是在不安全的无线网络上。

至于在客户端对密码进行哈希处理,一个更好的主意是查看客户端 SSL 证书,这些证书实际上是由浏览器本身生成的(假设您安装了 SSL 证书来加密连接)。只需<keygen>在您的 HTML 中添加一个标签,您的浏览器就会生成一个密钥对并将私钥存储在其密钥库中(示例)。然后在访问站点时,用户将公钥发送到服务器进行身份验证。不幸的是,它在所有当前的浏览器中都有点混乱,并且根本无法与 Internet Explorer 一起使用(惊喜,惊喜。谢谢你,微软!)。

于 2012-11-08T02:16:34.390 回答