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
Passwords 密码安全问题_Passwords_Security - Fatal编程技术网

Passwords 密码安全问题

Passwords 密码安全问题,passwords,security,Passwords,Security,我正在为一个网站做一个用户认证的事情 在阅读了《无辜代码》一书之后,我按照它的建议将密码存储为散列(username+password+salt)。其理论是,仅对密码进行哈希运算是不安全的(可能会受到字典/彩虹表攻击,如果多个用户使用相同的密码,则可能不会在任何给定站点上进行唯一哈希运算)。将用户名和密码散列在一起在任何给定的站点上都应该是唯一的,但是用户可能会在不同的站点上重复这些相同的凭据,因此如果它在一个站点上被破解,那么它可能在许多站点上被破解。因此,使用用户名、密码和特定于站点的sal

我正在为一个网站做一个用户认证的事情

在阅读了《无辜代码》一书之后,我按照它的建议将密码存储为散列(username+password+salt)。其理论是,仅对密码进行哈希运算是不安全的(可能会受到字典/彩虹表攻击,如果多个用户使用相同的密码,则可能不会在任何给定站点上进行唯一哈希运算)。将用户名和密码散列在一起在任何给定的站点上都应该是唯一的,但是用户可能会在不同的站点上重复这些相同的凭据,因此如果它在一个站点上被破解,那么它可能在许多站点上被破解。因此,使用用户名、密码和特定于站点的salt值的散列应该是全局唯一的散列(受散列算法本身的限制)

我目前在数据库中有两个表:用户和密码

users表存储用户名和有关该用户的相关信息(权限、首选项等),但不包含密码

密码表是存储密码哈希的单列表,如上所述。散列是该表上它自己的主键。我假设散列应该是足够唯一的,这样我就永远不可能得到重复的散列,因此也不可能得到重复的密钥(如果我的假设是错误的,请纠正我)。身份验证是通过从用户提供的用户名和密码(加上密码)重新创建散列来完成的并检查数据库中是否存在该散列。如果在里面,他们会验证

到目前为止,这是很好的工作

使用此方案,应该没有办法将密码哈希与任何特定用户关联。知道用户id不会帮助任何人找到相应的密码哈希

我不知道我是怎么想出这个计划的。我本以为我会在无辜的代码书中读到它,但我只是再读一遍,它只会用盐对密码进行哈希运算。它似乎不建议将密码从用户表中分离出来

现在我的问题是,如果我必须从系统中删除用户,我无法知道哪个密码与该帐户关联,因此我无法删除任何密码。我可以看到在未来的密码表中会出现孤立的密码哈希

所以我的问题是:我应该如何处理这个问题


我是否因为将密码与用户表分开而变得偏执?给自己制造了一个比我正在解决的更大的问题?将散列密码放在用户表中真的会有伤害吗?使用一个表来处理所有用户信息会更好吗?

我认为将密码放在用户表中不会有问题,因为您已经对它们进行了哈希运算,这会使您很难发现它们的原始状态


还请记住,您为保护密码所做的工作量应该与您在站点上的其他安全措施保持一致。例如,如果用户通过非SSL连接发送密码,那么将密码放在他们自己的表中就没有多大意义,等等,因为黑客可能只需监听连接就可以发现用户的密码。

是的,我认为你是偏执狂,造成了比你解决的问题更大的问题,你应该把散列密码放在用户表中


如果有人专门破解你的用户名+密码+salt,他们很可能只是贿赂你托管机构的某个人、某个员工或其他什么。如果您不是VISA,这种级别的安全性可能有点过头了。

与用户一起存储散列密码应该是安全的(您也可以为每个用户提供随机的salt,这样每个密码就不会使用相同的salt)。如果黑客获得了你的数据库,如果密码被哈希处理,那么它是否与某个特定的用户关联就不重要了(如果你真的对此心存疑虑,你也可以对用户名进行哈希处理)。

让我们假设你的方案是合理的。如果你孤立了一个密码散列,如果你的salt从未改变,那么你必须禁止以后使用曾经活跃的用户名,以防止以前的用户进入他们的同名帐户。不管你看起来怎么样,都不可能交到朋友。(至少我不喜欢;如果很久以前我有一个帐户,我不喜欢那些不允许我用自己的名字重新注册的网站。我甚至不喜欢更多让别人进入我帐户的网站…)

可能并没有“正确”的答案,但可以考虑使用一些变量作为salt的一部分。例如,如果salt是用户帐户创建时间戳的散列,它本身用一个可以从该时间戳计算的值进行了salt,该怎么办?必须有人找出您的密码哈希方案和时间戳哈希方案,并且在用户名与密码哈希关联之前生成时间戳哈希盐的方案可能会损害任何东西

然后,您可以更安全地将密码+散列的可变盐分时间戳值存储在用户表中。

数据库是私有的(无公共访问)?
您确定没有任何SQL注入潜在问题吗?
您的salt和hash密钥受保护吗? 安全漏洞允许访问数据库表和密码散列会产生什么影响?(到那时,剩下的数据将是我最大的担忧…)


我认为把密码散列在一个单独的表中是不值得的。

好吧,到目前为止,答案似乎都是一致的。我会放弃我的妄想:)一张桌子!友好提示:考虑编辑你的问题以简洁起见。我已经意识到删除用户并不需要成为一个问题。在删除其余用户信息之前,我只需从密码表中删除密码。