php中的密码/登录系统

php中的密码/登录系统,php,security,hash,login,Php,Security,Hash,Login,对于php中的登录系统,这是否是其工作原理的合适概述: 用户输入用户名和密码,单击登录按钮 检查数据库中是否存在用户 如果是的话,就把盐取出来 对于该用户 散列密码和 盐(这会在地板上做吗 客户端还是服务器端?我想 客户端会更好,但是php 是服务器端,那么你会怎么做 这个?) 对照中的值检查值 数据库 如果值匹配,则 用户输入了正确的密码 他们已经登录了 它必须是服务器端 检查数据库中是否存在用户,如果存在,然后为该用户检索salt哈希密码和salt(这是在客户端还是服务器端完成的?我认为客户

对于php中的登录系统,这是否是其工作原理的合适概述:

用户输入用户名和密码,单击登录按钮

  • 检查数据库中是否存在用户
  • 如果是的话,就把盐取出来 对于该用户
  • 散列密码和 盐(这会在地板上做吗 客户端还是服务器端?我想 客户端会更好,但是php 是服务器端,那么你会怎么做 这个?)
  • 对照中的值检查值 数据库
  • 如果值匹配,则 用户输入了正确的密码 他们已经登录了

  • 它必须是服务器端

    检查数据库中是否存在用户,如果存在,然后为该用户检索salt哈希密码和salt(这是在客户端还是服务器端完成的?我认为客户端会更好,但php是服务器端,那么您将如何做?)

    需要记住的重要一点是,您永远不会信任用户,这意味着在涉及身份验证的情况下,您应该尽可能多地在服务器端进行验证。给用户尽可能少的信息,不要相信他们的任何事情

    关于你的问题,显而易见的一点是,如果让用户预计算散列,那么涉及的数据传输要多得多。与单个请求和响应不同,需要3个请求和响应。它还将要求从浏览器增加到启用JavaScript的浏览器。根据您的受众,许多用户可以禁用JavaScript(通常通过NoScript插件)

    关于安全性,虽然允许用户查看salt不会影响对彩虹表的防御,但向他们展示如何将salt和密码结合起来

    通过web界面的暴力尝试并不是什么大问题,希望每个用户名每小时只允许5次(或更多)登录尝试。了解salt和hashing算法一点帮助都没有(它只会减少服务器负载;)。然而,如果他们拥有数据库,并且知道如何将salt和hash结合起来,那么暴力攻击就变得容易多了

    虽然隐蔽性带来的安全性并不是真正的防御措施,但它确实使系统更难被破坏,因此我建议您不要试图在客户端进行哈希运算

    检查数据库中是否存在用户,如果存在,则检索该用户的salt哈希密码和salt

    不,这意味着您要访问数据库两次

    散列密码和salt(这是在客户端还是服务器端完成的?我认为客户端会更好)

    不可以。对密码进行哈希处理的目的是,如果有人破坏了您的数据库,他们就无法(轻松地)找到需要发送到您的系统(或其他系统)以该用户身份登录的内容

    如果在将密码发送到服务器之前对其进行哈希,那么攻击者可以绕过JS,将从数据库读取的预哈希密码发送到系统

  • 用户提交用户名和密码
  • 密码是用系统的标准盐散列的
  • 从您的_用户中选择一些,cols,其中username=?和password=
  • 计算从数据库返回的行数
  • 为什么会有这么多动作

  • 检查数据库中是否存在用户,并使用给定的salt哈希密码
  • 如果有,则检索用户信息
  • 就这些


    如果您谈论的是从客户端到服务器的安全密码传输-这是另一个故事,您可以参考模式的HTTP摘要授权描述。简言之,这是使用存储在服务器端的随机一次性令牌进行客户端密码散列。或者SSL,当然,您的思路是正确的,但让我来帮助您改进我喜欢你的系统

    生成强随机密钥并将其存储在文档根目录上方的文件中:

    /home/username/key
    /home/username/public_html/login.php
    
    该文件应该包含尽可能强度的(伪)随机二进制数据。512位的随机数据应该可以

    然后为系统中的每个用户生成一个唯一的salt。该salt不必大于16位随机二进制数据

    最后,密码散列应该类似于:

    hash('sha256', $password . $salt . $key);
    
    哈希算法非常重要的地方。不要使用MD5或SHA-1。使用SHA-2系列,通常是SHA-256或SHA-512。此外,Whirlpool是一个不错的选择

    如果您想进一步改进您的系统,您可以一次又一次地迭代散列,如下所示:

    public static function hash($algorithm, $data, $iterations = 1, $rawOutput = false)
    {
        if ($iterations < 1)
            throw new Exception('There must be at least one iteration.');
    
        while ($iterations--)
        {
            $data = hash($algorithm, $data, true);
        }
    
        return ($rawOutput ? (binary) $data : bin2hex($data));
    }
    
    公共静态函数哈希($algorithm,$data,$iterations=1,$rawOutput=false)
    {
    如果($iterations<1)
    抛出新异常('必须至少有一次迭代');
    而($iterations--)
    {
    $data=hash($algorithm,$data,true);
    }
    返回($rawOutput?(二进制)$data:bin2hex($data));
    }
    
    大多数(如果不是所有的话)表单验证都应该在服务器端完成。用户将能够查看所有客户端代码,并且在客户端完成跨数据库的任何验证都会有大量的安全问题

    可能有不同的方法来实现您正在尝试做的事情。以下是我将要做的:

  • 如果希望将用户重定向到某个位置,并且需要该页面的用户名,请启动会话
  • PHP中散列的一般语法是
    hash('nameOfHashFunction',$pswrd.$salt);
    您可以将其与为特定用户存储的散列交叉验证
  • SHA家族的最新成员是SHA-3,它于2015年发布。你可以在其维基百科页面上阅读更多关于它的信息。如果你在阅读这篇文章时发现了SHA家族的新成员,我强烈建议你稍微阅读一下,然后改用它


    仅当您不使用SSL时。但是,如果您在客户端使用SSL,则客户端必须了解数据库的加密方法,这不是它的责任。此外,客户端