Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 此用户身份验证是否足够安全?_Php_Security_Authentication_Hash - Fatal编程技术网

Php 此用户身份验证是否足够安全?

Php 此用户身份验证是否足够安全?,php,security,authentication,hash,Php,Security,Authentication,Hash,我正在尝试放弃使用md5()来存储和比较密码。所以我想开始使用密码\u hash() 现在,我以前是这样做的,我会在他们的会话或cookie(如果他们选择“记住我”)中存储用户名和他们密码的md5,然后检查数据库,看看是否存在使用该用户名和md5密码的用户。我意识到这不是很安全,这就是为什么我想阻止这一切 我不能再这样做了,因为password\u hash()总是会更改,所以我不能在他们的会话中存储一个hash,然后在数据库中检查它,因为我需要对未更改的密码使用password\u verif

我正在尝试放弃使用md5()来存储和比较密码。所以我想开始使用密码\u hash()

现在,我以前是这样做的,我会在他们的会话或cookie(如果他们选择“记住我”)中存储用户名和他们密码的md5,然后检查数据库,看看是否存在使用该用户名和md5密码的用户。我意识到这不是很安全,这就是为什么我想阻止这一切

我不能再这样做了,因为password\u hash()总是会更改,所以我不能在他们的会话中存储一个hash,然后在数据库中检查它,因为我需要对未更改的密码使用password\u verify

因此,我的问题是,如果我在用户成功登录时在用户表中存储散列的“会话id”和“令牌”,然后将其与用户id一起存储在persons session/Cookie中以检查数据库,这是否足够安全?当我说散列的“会话id”和“令牌”时,我指的是随机大数的sha256'd甚至md5'd散列

例如:

用户登录->散列的“会话id”和“令牌”存储在用户cookie/会话中,并使用散列的“会话id”和“令牌”更新其在数据库中的行

用户访问站点->代码根据浏览器会话/cookie变量检查其“会话id”和“令牌”是否存在于数据库中。如果是,则假定找到的行代表当前用户


如果您有任何见解,我们将不胜感激。

下面的示例提供了最佳密码哈希和用法,同时代码也很简单

$salts=['cost'=>12];
密码\u散列(“密码”,密码\u BCRYPT,$options)

$salts
是一个数组,当使用
密码\u hash()
时,它组合了多个时间


PASSWORD\u BCRYPT
是一种使用“$2y$”标识符和blowfish加密算法对字符串进行散列的算法。这将输出60个字符的混乱集。

我要做的是,当用户登录时,使用uinqid()为他的登录生成一个唯一的id,然后将其存储在一个新表中。然后检查此表,查看cookie是否与表中存储的uniqid匹配

您必须确保在用户再次登录时删除表行,但如果用户在多个设备上设置了“记住我”,则会导致问题,因此我会在表中为每个id设置过期日期,登录脚本将:

  • 从$current\u date\u和\u time>的“UNIQIDS”中选择*并删除所有结果
  • 检查是否存在cookie。如果有一个会话并且它与uniqid匹配,则在计算机上创建一个会话,否则显示登录页面
  • 用户登录时:

  • 检查表中是否已存储uniqid
  • 如果存储了一行,如果当前日期和时间超过其过期日期,则删除该行
  • 如果该cookie已过期,则生成一个新cookie,其新过期日期与您正在生成的cookie的过期日期匹配。如果该cookie尚未过期,请计算从现在到过期的时间,并创建一个包含其值的cookie,该cookie将在您计算的时间内过期
  • 这是高度安全的,因为很难伪造此cookie,而且它不会将用户密码信息传递到客户端计算机

    为了更安全,您可以md5生成的uniqid,但没有真正的需要,因为它不包含重要信息

    这是相当复杂的,但如果你一步一步地去做,那就不可能了


    祝你好运

    您可以使用盐渍密码哈希。@PraveenD-Password_hash()已经生成盐渍哈希了。。。。您的实际建议是什么?Salt应该是随机的。@PraveenD-password_hash()生成一个Salt散列,其中Salt已经是随机的了。。。。。OP已经意识到了这一点,如果您解释了您的意思,静态salt可能会完全消除使用password_hash的效果。如果要这样做,我最好还是坚持使用md5()。您可以添加任意数量的键⇒
    $salts中的值
    请不要做
    ['salt'=>12]
    ,你想要
    ['cost'=>12]
    。这是对的@Scott Arciszewski,我后来意识到。使用
    ['cost'=>12]
    这并不能解决OPs问题。虽然密码散列也是如此,但问题是如何存储会话令牌,其散列必须可搜索且不能包含随机salt。在存储到数据库中之前,应对令牌进行散列,否则具有db读取权限(SQL注入)的攻击者可以读取令牌并模拟用户。因为令牌(20+随机字符)是一个非常强的“密码”,所以可以使用像SHA-256这样的快速非盐散列,使它们具有可比性。不一定。如果从表中选择所有行,不给最终用户访问SQL语句的权限,创建一个assoc,并使用for/loop让php搜索assoc,而不是让mysql在返回assoc之前搜索表,则会使表不受SQL注入的影响。在那之后,如果你的SQL被黑客攻击,你会遇到比哈希的安全性更大的问题。它不一定是一个带有标记的表查询,这可能会暴露哈希,每个SQL语句都必须安全。请看我书中的例子。如果您使用第三方库,您也必须测试此代码。即使这样,代币也会有其他方式丢失,丢弃的服务器,备份,……对不起,先生,你是对的。uniqid应该进行散列以确保安全性以及任何其他潜在的敏感信息,但谨慎的做法是确保采取预防措施防止sql注入,因为任何确定的黑客都可以在足够的时间内破解散列。还要确保uniqid和cookie的过期频率相当高,以防止有人通过重复创建具有不同值的假cookie来粗暴地破坏您的系统。