更多的概念问题,实际上不是问题,但我对这个概念的评论很好奇:
在现代Unix系统上,你有一个shadow passwd,存储所有用户的所有密码。该文件只能通过某些特权读取,而不能由“普通”用户读取,因此甚至可以防止加密密码被泄露。
对于Web应用程序,我看到的所有概念都只在一个表中存储用户ID和密码,如
|uid|name|surname|address|....|passwdhash|...|
按照上面的想法,我做到了:
Table users
|uid|name|surname|address|....|....|...|
Table passwords
|rowid|keyhash|passwdhash|... other| critical| stuff| ....
两个表之间没有SQL关系(也就是外键约束等)。表完全不相交!
因此,找到用户的密码遵循此算法:
SELECT ... from users
compile keyhash from user data
log in to DB as privileged user
SELECT passwdhash from passwords where keyhash = <compiled value>
logoff from DB
显然,表passwdhash只有特定用户才能选择/读取/更新。
目前的优势:
即使某人可能通过应用程序访问数据库,仍然很难获得用户密码(甚至其他相关信息)。当然不包括蛮力或彩虹,它只会阻止使用用户ID和密码哈希窃取整个数据库列表。即使有人闯入应用程序,他仍然无法像上面的Unix系统那样读出密码表
问:
感谢您在3微秒后没有将其置于话题之外......; - )