我偶尔会看到一些问题,询问如何安全地存储Web应用程序的用户密码(使用RDBMS,我不是在谈论Facebook或Twitter)。通常的答案是“先给密码加上盐,然后使用强大的算法(例如TDES或SHA512)对密码进行哈希处理”。
我的问题是:作为RDBMS用户,由于大多数引擎具有内置的身份验证机制,为什么我应该完全解决密码存储问题。
例如,如果某个用户X想要在我的Web应用程序上创建一个帐户用户密码Y,则如何发出以下查询错误:
CREATE USER X WITH ENCRYPTED PASSWORD Y IN GROUP baseuser;
然后,在我的应用程序中,用户可以使用其凭据打开与数据库的连接,而我不必操心所有密码管理。
我看到此方法有多个优点:
- 如果RDBMS决定需要更改加密算法,那么我不需要进行任何操作,只需要应用安全更新即可。
- 对我来说,管理用户授权很容易。如果将用户提升为管理员角色,我只需要将该用户添加到相应的组即可;
- 现在,SQL注入已变得毫无意义,因为我可以管理权限以完全允许数据库中的每个用户(例如,在诸如SO之类的论坛中,添加新帖子,回复帖子,评论和编辑/删除自己的问题) / answers / comments);
- 用户帐户“匿名”可用于与我的应用程序的未经身份验证的连接;
- 每个用户都是他提供的数据的所有者。
但是,对于我在该主题上遇到的几乎每个问题,似乎都已达成共识,那就是这不是必须要做的事情。我的问题是:为什么?
注:第三点是允许的政策在PostgreSQL和安全政策在Microsoft SQL Server。我意识到这些概念是新来的,但是无论如何,既然它们已经出现,为什么我描述的技术没有成为处理用户帐户的标准方法?