专为储存密码而设计的数据库, 可能在一年内开源

2015-12-16 01:21:48 +08:00
 mzer0

我设计了一个专为储存用户密码的数据库, 编写语言为 C++, 目前只是自己用, 代码写得很简陋(仅仅使用了 C++的 map 类), 把原理贴出来给大家分析一下安全性, 顺便求个名字. 倘若有时间能重写代码, 会考虑开源. 请不吝赐教, 谢谢!


每个用户由三个元素基本构成:

数据库类型为 Key-Value 数据库, 数据库内维护两组基本关系:

其中, PN/UID/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 的访问权限和访问次数是不限制的.

另外是一些考虑加进去的功能:


完. 谢谢.

5665 次点击
所在节点    程序员
38 条回复
ryd994
2015-12-16 01:37:17 +08:00
1. 为什么不做一个中间件,利用现有的数据库?
2. 私有函数用于密码安全,还是用于保障密码安全……我能呵呵么?
3. 考虑过传输安全么?虽然这个文提只要正确地套个 TLS 就能解决
4. UID 可变……我能再呵呵么?
5.你似乎还是没有明白为什么 KDF 必须足够慢,也没有加盐。
ryd994
2015-12-16 01:39:48 +08:00
@ryd994 2. 私有函数用于密码安全,还是用于保证复杂度……我能呵呵么?
hooopo
2015-12-16 02:48:37 +08:00
msg7086
2015-12-16 02:55:59 +08:00
@hooopo 回复莫用 MD 。
msg7086
2015-12-16 02:59:22 +08:00
等等,为什么是「存储密码」?
如果要存储的话 PP 怎么可能不被访问。
如果只是验证的话又为何要储存一组保密的数据。
hooopo
2015-12-16 03:22:45 +08:00
@msg7086 。。。
ryd994
2015-12-16 04:28:21 +08:00
是不是要考虑如下情况:穷举符合 F 的明文快速筛选,用于穷举 G 。
mzer0
2015-12-16 04:38:11 +08:00
@ryd994 这个是很难做到的, 因为 x(密码)的空间比 UID 大太多了, 穷举原像是不可能的. 例如, 网站有一千万用户, UID 的上限可能是 10 亿(10^9), 密码最大长度为 16 个字符, 可以考虑为 16 字节, 上限为 2^128, 大于 10^32, 平均每个密码至少有 10^23 个原像.
v1024
2015-12-16 07:41:16 +08:00
本科毕设即视感
strahe
2015-12-16 09:20:37 +08:00
没加盐
denghongcai
2015-12-16 09:43:08 +08:00
确实应该是一个中间件的形式存在而不是一个数据库
kookxiang
2015-12-16 09:53:17 +08:00
密码最大长度为 16 个字符
不想看了
akagi
2015-12-16 12:25:52 +08:00
提供一个非技术的角度,觉得很难推广起来,第三方接入的意义不大。
edsgerlin
2015-12-16 12:35:25 +08:00
@kookxiang +1 ,没加盐,密码长度受限,有现成的 KDF 不用,感觉是正经密码学导论书都没读完一本的人写出来的。
mzer0
2015-12-16 13:16:01 +08:00
1) 我没提到密码长度最长为 16 字符, 我在 8 楼的回复仅仅只是用 16 字符举例.

2) 这不是本科毕设. 相反, 我在大学中的专业是数学, 读过代数学和数论, 对离散密码和椭圆曲线密码有肤浅的了解, 实现一些密码系统曾经是我的作业. 对某些抬扛的朋友: 我比你更清楚加盐以及 KDF 的意义, 相反, 你除了知道这些名词以外, 什么都不懂. 你们真是耻辱.

不再回复任何抬扛. 接受提问, 接受友好的讨论, 接受建议及意见. 谢谢.
zhe13
2015-12-16 13:21:48 +08:00
@mzer0 说得好。(来自数学系的一面小红旗
blabla
2015-12-16 14:14:31 +08:00
做比说难,给你点赞!特别佩服数学厉害且能写程序的人。
xenme
2015-12-16 14:27:25 +08:00
现在 mssqlserver 有全程加密数据库,从最开始连接到处理全部加密,感觉是个趋势
iugo
2015-12-16 15:04:31 +08:00
如何与已有的系统对接.

我更倾向网站不在本地储存密码, OAuth 2.0 稳健的第三方.
wy315700
2015-12-16 15:13:36 +08:00
感觉,本质上 是拿 PN 来当做一个 salt

不过想到一点,如果 PP 和 UID 都泄露了,
相当于是有两个函数来进行求原象。
会不会先可以分别求每个函数的原象范围,然后求交集,缩小原象的范围。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243832

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX