更多的是一个概念性问题,实际上不是问题,但我对这个概念的评论很好奇:
在现代 Unix 系统上,您有一个影子密码,存储所有用户的所有密码。该文件只有特定权限才能读取,“普通”用户不能读取,因此即使加密的密码也不会被泄露。
对于 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 微秒后没有将其置于主题之外...... ;-)