我设计了一个专为储存用户密码的数据库, 编写语言为 C++, 目前只是自己用, 代码写得很简陋(仅仅使用了 C++的 map 类), 把原理贴出来给大家分析一下安全性, 顺便求个名字. 倘若有时间能重写代码, 会考虑开源. 请不吝赐教, 谢谢!
每个用户由三个元素基本构成:
- PN, Public Name
- UID, Unique ID
- PP, Private Password
数据库类型为 Key-Value 数据库, 数据库内维护两组基本关系:
- PN(Public Name) -> UID(Unique ID)
- UID(Unique ID) -> PP(Private Password)
其中, PN/UID/PP 的可见级别是不一样的:
- 一个账户的 PN(Public Name)可以, 或有可能被任意用户知晓. PN 唯一, 可变更.
- 一个账户的 UID(Unique ID)只能被网站内运行的程序知晓. UID 唯一, 可变更.
- 一个账户的 PP(Private Password)不可被知晓, 只能被验证. PP 不唯一, 可变更.
"两级验证"的用户登录模型, 假设 x0 为确定内容, 例如用户真正的密码, x 为不确定内容, 例如用户每次登录时输入的密码:
1) 私有弱离散函数 F(快速), 设置 UID = F(PN, x0).
2) 私有强离散函数 G(缓慢), 设置 PP = G(PN, UID, x0).
3) 不涉及敏感操作, 例如普通登录, 验证 UID == F(PN, x).
4) 涉及敏感操作, 例如修改密码, 验证 PP == G(PN, UID, x).
设计的目的在于: 减少 PP 的使用次数, 使得绝大多数情况下, PP 不会被访问; 限制 PP 在一定时间内的访问次数; 访问 PP 需要高权限. 其次, 私有函数 F 和 G 都是限制访问的. 但是, UID 的访问权限和访问次数是不限制的.
另外是一些考虑加进去的功能:
- 生成日志, 记录修改 PN/UID/PP 的日期, 及记录每次验证时的细节, 如 IP 地址.
- 公开授权系统, 提供给第三方授权的服务.工作量比较大.
- 储存 session/cookie, 不太想做, 觉得不是这个数据库应该做的事情.
完. 谢谢.