Mic*_*tta 38
不要存储密码.如果它曾经坐在磁盘上,它可能会被盗.而是存储密码哈希值. 使用正确的散列算法,如bcrypt(包含salt).
编辑:OP回复说他理解上述问题.
无需将密码存储在与登录物理不同的表中.如果一个数据库表遭到破坏,那么访问同一数据库中的另一个表并不是一个很大的飞跃.
如果您充分关注安全性和深度安全性,则可以考虑将用户凭据存储在与域数据完全独立的数据存储中.通常,一种方法是将凭证存储在LDAP目录服务器中.这可能也有助于您稍后执行的任何单点登录工作.
Rob*_*Rob 18
密码应存储为加密哈希,这是一种阻止读取纯文本的不可逆操作.在对用户进行身份验证时,密码输入会经过相同的散列处理并与哈希值进行比较.
避免使用快速廉价的哈希,如MD5或SHA1; 目标是使攻击者计算彩虹表(基于哈希冲突)的代价高昂; 快速哈希抵消了这一点.对于身份验证方案,使用昂贵的哈希不是问题,因为它对单个哈希运行没有影响.
除了散列之外,还使用随机生成的值对哈希进行加盐; 一个随机数,然后存储在数据库中,并在散列之前与数据连接.这增加了在计算冲突时必须生成的可能组合的数量,并因此增加了生成彩虹表的总时间复杂度.
您的密码哈希列可以是固定长度; 您的加密哈希应该输出可以编码为固定长度的值,对于所有哈希值都是相同的.
尽可能避免滚动自己的密码认证机制; 使用现有的解决方案,例如bcrypt.
有关如何处理密码以及您需要关注的内容的绝佳解释,请访问http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-需要知道的安全密码方案.
最后请注意,如果攻击者获得了对您数据库的访问权限,那么您的直接关注应该是他们可能访问的任何敏感或个人识别信息,以及他们可能造成的任何损害.
Sas*_*gov 14
将它们放在同一个表中没有错.事实上,它会快得多,所以我强烈推荐它.我不知道你为什么要分开它.
我会尝试回答你原来的问题.将它全部放在一个表中是好的,除非您只是收集了大量的个人信息.在这种情况下,拆分可能是有意义的.该决定应基于您正在处理的个人信息量以及需要访问的频率.
我会说大多数时候我会在一张桌子上做这样的事情:
UserID, FirstName, LastName, Email, Password, TempPassword
Run Code Online (Sandbox Code Playgroud)
但是......如果你收集的不止这些.假设您正在收集电话,传真,出生日期,传记等等.如果很少访问大部分信息,那么我可能会将其放在自己的表中,并将其与一对一的关系联系起来.毕竟,表上的列越少,对该表的查询就越快.有时,简化访问最多的表是有意义的.无论何时您需要访问该个人信息,JOIN都会受到性能影响,因此您必须考虑这些因素.
编辑 - 你知道吗,我只是想到了什么.如果您在用户名或电子邮件字段(根据您的喜好)创建索引,它几乎完全消除了在用户表中创建如此多列的性能缺陷.我这样说是因为每当你登录WHERE子句时,如果它有一个索引,实际上会非常快速地找到用户名,如果你在该表中有100列则无关紧要. 所以我改变了我的看法.我把它全部放在一张桌子里.;)
在任何一种情况下,由于安全性似乎是一个热门话题,密码应该是一个哈希值.我建议使用SHA1(或SHA256,如果你真的很关心它).TempPassword也应该使用哈希,它只用于忘记密码功能.显然,使用哈希,您无法解密并向用户发送其原始密码.因此,您生成一个他们可以登录的临时密码,然后强制他们在登录后再次更改密码.