php中的密码/登录系统
对于php中的登录系统,这是否是其工作原理的合适概述: 用户输入用户名和密码,单击登录按钮php中的密码/登录系统,php,security,hash,login,Php,Security,Hash,Login,对于php中的登录系统,这是否是其工作原理的合适概述: 用户输入用户名和密码,单击登录按钮 检查数据库中是否存在用户 如果是的话,就把盐取出来 对于该用户 散列密码和 盐(这会在地板上做吗 客户端还是服务器端?我想 客户端会更好,但是php 是服务器端,那么你会怎么做 这个?) 对照中的值检查值 数据库 如果值匹配,则 用户输入了正确的密码 他们已经登录了 它必须是服务器端 检查数据库中是否存在用户,如果存在,然后为该用户检索salt哈希密码和salt(这是在客户端还是服务器端完成的?我认为客户
它必须是服务器端 检查数据库中是否存在用户,如果存在,然后为该用户检索salt哈希密码和salt(这是在客户端还是服务器端完成的?我认为客户端会更好,但php是服务器端,那么您将如何做?) 需要记住的重要一点是,您永远不会信任用户,这意味着在涉及身份验证的情况下,您应该尽可能多地在服务器端进行验证。给用户尽可能少的信息,不要相信他们的任何事情 关于你的问题,显而易见的一点是,如果让用户预计算散列,那么涉及的数据传输要多得多。与单个请求和响应不同,需要3个请求和响应。它还将要求从浏览器增加到启用JavaScript的浏览器。根据您的受众,许多用户可以禁用JavaScript(通常通过NoScript插件) 关于安全性,虽然允许用户查看salt不会影响对彩虹表的防御,但向他们展示如何将salt和密码结合起来 通过web界面的暴力尝试并不是什么大问题,希望每个用户名每小时只允许5次(或更多)登录尝试。了解salt和hashing算法一点帮助都没有(它只会减少服务器负载;)。然而,如果他们拥有数据库,并且知道如何将salt和hash结合起来,那么暴力攻击就变得容易多了 虽然隐蔽性带来的安全性并不是真正的防御措施,但它确实使系统更难被破坏,因此我建议您不要试图在客户端进行哈希运算 检查数据库中是否存在用户,如果存在,则检索该用户的salt哈希密码和salt 不,这意味着您要访问数据库两次 散列密码和salt(这是在客户端还是服务器端完成的?我认为客户端会更好) 不可以。对密码进行哈希处理的目的是,如果有人破坏了您的数据库,他们就无法(轻松地)找到需要发送到您的系统(或其他系统)以该用户身份登录的内容 如果在将密码发送到服务器之前对其进行哈希,那么攻击者可以绕过JS,将从数据库读取的预哈希密码发送到系统
如果您谈论的是从客户端到服务器的安全密码传输-这是另一个故事,您可以参考模式的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));
}
大多数(如果不是所有的话)表单验证都应该在服务器端完成。用户将能够查看所有客户端代码,并且在客户端完成跨数据库的任何验证都会有大量的安全问题
可能有不同的方法来实现您正在尝试做的事情。以下是我将要做的:
hash('nameOfHashFunction',$pswrd.$salt);
您可以将其与为特定用户存储的散列交叉验证仅当您不使用SSL时。但是,如果您在客户端使用SSL,则客户端必须了解数据库的加密方法,这不是它的责任。此外,客户端