Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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_Session_Authentication_Passwords_Salt - Fatal编程技术网

Php 密码、密码和身份验证

Php 密码、密码和身份验证,php,session,authentication,passwords,salt,Php,Session,Authentication,Passwords,Salt,如果我有一个随机的、16个字符长的、字母数字的salt(大小写不同),它是每个用户生成和存储的,那么我还需要一个站点范围的salt吗 换句话说,这好吗 sha1($user_salt . $password) 我应该这样做吗 sha1($user_salt . $password . $site_salt) 而且 目前,我有一个加密的cookie,它在数据库中查找会话。在此会话中,有一个用户标识和一个用户令牌。然后,我使用user_id查询数据库——如果user_id+hash in DB=

如果我有一个随机的、16个字符长的、字母数字的salt(大小写不同),它是每个用户生成和存储的,那么我还需要一个站点范围的salt吗

换句话说,这好吗

sha1($user_salt . $password)
我应该这样做吗

sha1($user_salt . $password . $site_salt)
而且

目前,我有一个加密的cookie,它在数据库中查找会话。在此会话中,有一个用户标识和一个用户令牌。然后,我使用user_id查询数据库——如果user_id+hash in DB===user_令牌的sha1,那么允许用户通过

每次加载页面时,我都会对用户id进行第二次查询,这样,如果我删除、禁止或更改用户的密码,该操作将立即生效

这是我通过网站和这里的问题找到的。你怎么认为?我错过什么了吗


我需要添加角色检查,但这可能会添加另一个查询(第三个仅用于auth)。有什么建议吗?

没有,你不需要全站点的盐。盐是用来做彩虹桌子的。如果你真的想的话,可以使用站点范围内的盐,但我认为没有必要

我认为,如果你的数据库遭到破坏,有人意识到你的密码被salt乱码,他们会转移到下一个安全性较低的站点(当然,除非你运行的站点值得黑客攻击——很可能你不是:p)

使用“站点范围”的salt可能有用。这意味着,为了真正理解您的密码方案,不仅您的数据库必须被破坏,您的源代码也必须被破坏

我称之为“盐”和“胡椒”方法。每个用户储存的盐、胡椒是整个站点的价值


每人一份的唯一盐的目的是使彩虹表无效。salt通常存储在数据库中,并在密码后面或前面添加。意识到这一点的人仍然可以对每个用户运行基于字典的攻击,但salt的好处是,他们不能使用彩虹表来处理这些常见的字典术语

胡椒

我称之为“pepper”的目的是在每个密码中添加一个可能未知的字符串,这意味着考虑到salt的暴力字典攻击会因为缺少pepper而完全失败。这也意味着每字符暴力检查需要“发现”更长的密码,这可能需要更长的时间。一旦发现胡椒粉,这些好处就会消失。

听起来你好像在试图重新创造或使用它。这两种方法都允许您存储站点独有的非密码字符串,并与另一方进行质询/响应,以验证他们是否拥有密码字符串,而无需在线路上发送密码字符串

sha1($user_salt . $password)
这很常见,但并不好

典型的最终用户密码长度约为8个字符,并且大多保留为7位ASCII字符集。因此,一个典型的密码大约是64位或更少的随机数据。Modern可以通过简单地尝试所有可能的密码来克服这一点。改用SHA256或SHA512不会实质性地改变结果,因为最终用户密码是限制因素

根据我在Stack Overflow上的阅读,关于密码存储,似乎有两种观点:

  • 你应该使用一个。这样暴力攻击就不可行了。这样做的代价是,当用户登录时,服务器需要更多的CPU电源。看这个
  • 第二种观点认为,虽然BCrypt和scrypt确实可以工作,但它们对于多用户应用程序来说是不可取的,因为它们占用了太多的CPU时间——让最终用户等待,或者通过发送大量身份验证请求,有可能导致拒绝服务攻击。请参阅(请务必阅读评论)
  • 目前,我有一个加密的cookie,它在数据库中查找会话。在此会话中,有一个用户标识和一个用户令牌。然后,我使用user_id查询数据库——如果user_id+hash in DB===user_令牌的sha1,那么允许用户通过

    您没有提到的安全会话处理的一个要点是。用户ID通常不利于安全性,因为它们通常是可猜测的(自动递增主键),或者它们错误地出现在URL中。除了滚动您自己的会话处理系统,您是否可以使用同行评审的代码库

    目前,我有一个加密的 cookie,它在 DB。在本节课中,有一个 用户标识和用户令牌。我那么 使用用户_id查询数据库——如果 用户的sha1_id+哈希值(以DB为单位)=== 用户\u令牌,则允许该用户 通过

    我对用户id执行第二次查询 在每个页面上加载,以便 删除、禁止或更改的密码 如果是用户,则该操作将立即生效 效果

    仅在此处出现其他人未发现的错误时进行评论:

  • 你提到cookie是加密的
  • 您的意思是用户id+哈希的sha1
  • 您提到了第二个对密码更改敏感的查询(我不清楚这两个查询是什么)
  • 听起来很像是在cookie中存储密码或密码哈希,而不是在cookie中存储会话标识符。我建议不要那样做。最大的原因是,像这样使用密码的派生词很有可能将派生词转换成等价的密码

    换句话说,攻击者所需要的只是密码的散列,而不是密码本身,以便有效地进行身份验证。问题是密码的散列不会改变,除非密码改变(不在您的控制之下),而会话ID会随您的需要而改变

    我的建议(如果您希望会话对密码更改敏感)是在