如何最好地存储用户信息和用户登录名和密码

Tim*_*Tim 30 php mysql security passwords

我正在使用Mysql,我认为最好将用户个人信息及其登录名和密码分成两个不同的表,然后在两者之间引用它们.

注意:为了澄清我的帖子,我了解保护密码(哈希,盐等)的技巧.我只知道,如果我遵循生命中其他部分(投资,数据备份,甚至是个人存储)的做法,在最坏的情况下(包括表格或火灾),在表格之间分配信息可以保护您的其他数据.

Mic*_*tta 38

不要存储密码.如果它曾经坐在磁盘上,它可能会被盗.而是存储密码哈希值. 使用正确的散列算法,如bcrypt(包含salt).

编辑:OP回复说他理解上述问题.

无需将密码存储在与登录物理不同的表中.如果一个数据库表遭到破坏,那么访问同一数据库中的另一个表并不是一个很大的飞跃.

如果您充分关注安全性和深度安全性,则可以考虑将用户凭据存储在与域数据完全独立的数据存储中.通常,一种方法是将凭证存储在LDAP目录服务器中.这可能也有助于您稍后执行的任何单点登录工作.

  • 除SHA建议外,其他所有内容均为+1.SHA和MD5属于相同的,不足的散列算法类 - 从安全角度来看,与自适应散列相比,它们都很苍白,如下面的Rob所述. (3认同)
  • 您完全正确,MD5不够强大。 (2认同)
  • @musicfreak:我不同意,问题的表达方式可能暗示OP并未考虑用户管理的这一方面,这比是否在单独的表中存储用户名和密码哈希重要得多。一个好的答案可以解决更大的问题。您当然可以不同意。 (2认同)

Rob*_*Rob 18

密码应存储为加密哈希,这是一种阻止读取纯文本的不可逆操作.在对用户进行身份验证时,密码输入会经过相同的散列处理并与哈希值进行比较.

避免使用快速廉价的哈希,如MD5或SHA1; 目标是使攻击者计算彩虹表(基于哈希冲突)的代价高昂; 快速哈希抵消了这一点.对于身份验证方案,使用昂贵的哈希不是问题,因为它对单个哈希运行没有影响.

除了散列之外,还使用随机生成的值对哈希进行加盐; 一个随机数,然后存储在数据库中,并在散列之前与数据连接.这增加了在计算冲突时必须生成的可能组合的数量,并因此增加了生成彩虹表的总时间复杂度.

您的密码哈希列可以是固定长度; 您的加密哈希应该输出可以编码为固定长度的值,对于所有哈希值都是相同的.

尽可能避免滚动自己的密码认证机制; 使用现有的解决方案,例如bcrypt.

有关如何处理密码以及您需要关注的内容的绝佳解释,请访问http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-需要知道的安全密码方案.

最后请注意,如果攻击者获得了对您数据库的访问权限,那么您的直接关注应该是他们可能访问的任何敏感或个人识别信息,以及他们可能造成的任何损害.

  • 该博文已移至http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html (2认同)

Sas*_*gov 14

将它们放在同一个表中没有错.事实上,它会快得多,所以我强烈推荐它.我不知道你为什么要分开它.

  • 不,因为每当你获得userdata时你都需要做JOIN.要么你或者你有很多重复的信息(例如存储在两者中的用户名和ID等),这两者都不是最佳的.无论哪种方式,都没有理由将其分成两个不同的表格; 无论是性能还是简单,它都没有任何意义. (2认同)

Ste*_*ham 8

我会尝试回答你原来的问题.将它全部放在一个表中是好的,除非您只是收集了大量的个人信息.在这种情况下,拆分可能是有意义的.该决定应基于您正在处理的个人信息量以及需要访问的频率.

我会说大多数时候我会在一张桌子上做这样的事情:

UserID, FirstName, LastName, Email, Password, TempPassword
Run Code Online (Sandbox Code Playgroud)

但是......如果你收集的不止这些.假设您正在收集电话,传真,出生日期,传记等等.如果很少访问大部分信息,那么我可能会将其放在自己的表中,并将其与一对一的关系联系起来.毕竟,表上的列越少,对该表的查询就越快.有时,简化访问最多的表是有意义的.无论何时您需要访问该个人信息,JOIN都会受到性能影响,因此您必须考虑这些因素.

编辑 - 你知道吗,我只是想到了什么.如果您在用户名或电子邮件字段(根据您的喜好)创建索引,它几乎完全消除了在用户表中创建如此多列的性能缺陷.我这样说是因为每当你登录WHERE子句时,如果它有一个索引,实际上会非常快速地找到用户名,如果你在该表中有100列则无关紧要. 所以我改变了我的看法.我把它全部放在一张桌子里.;)

在任何一种情况下,由于安全性似乎是一个热门话题,密码应该是一个哈希值.我建议使用SHA1(或SHA256,如果你真的很关心它).TempPassword也应该使用哈希,它只用于忘记密码功能.显然,使用哈希,您无法解密并向用户发送其原始密码.因此,您生成一个他们可以登录的临时密码,然后强制他们在登录后再次更改密码.