Php 密码、密码和身份验证
如果我有一个随机的、16个字符长的、字母数字的salt(大小写不同),它是每个用户生成和存储的,那么我还需要一个站点范围的salt吗 换句话说,这好吗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=
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上的阅读,关于密码存储,似乎有两种观点: