1

更多的是一个概念性问题,实际上不是问题,但我对这个概念的评论很好奇:

在现代 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 系统那样读出密码表

问:

  1. 有没有人听说过这样的概念?
  2. 有没有人实施过这样的事情和
  3. 在运行时环境中有哪些体验

感谢您在 3 微秒后没有将其置于主题之外...... ;-)

4

0 回答 0