这儿有一个伪需求

2017-08-23 23:31:42 +08:00
 Victor215

现在有一个伪需求,按道理来讲是不可能提出来的,但是也可以想想。

需求: 设计一个密码储存的方式可以支持两个密码登陆同一个账户,但是密码的储存只能用一个字段。

直接能想到的就是可以把两个密码用分隔符连在一起,但是除了这种方式还有什么更好的方案么?有没有啥数学上的算法是支持的?

4566 次点击
所在节点    程序员
33 条回复
misaka20038numbe
2017-08-23 23:43:36 +08:00
新增除密码不一样其他都一样的行。
frankyzf
2017-08-24 00:25:20 +08:00
密码单独建张表?
widewing
2017-08-24 01:06:59 +08:00
直接连的方案哪儿不好了?
lydasia
2017-08-24 01:12:33 +08:00
数学上?两个大质数的积这种?
qiayue
2017-08-24 01:13:26 +08:00
不需要根据密码来查询账户,所以连在一起是最好的办法
而且如果密码处理成同样位数字符串,连接符都不需要,直接根据长度切分就可以
SpikeKnox
2017-08-24 01:15:34 +08:00
反向想下,手机号或用户名同一密码都能登录。存法不同,当 ID 是密码,I 手机号和用户名就是两个不同密码
blankme
2017-08-24 01:26:27 +08:00
不可能的

你所存储的字段最基本的要求是,无法反推出密码

假设用户设置了密码 p1,映射到字段 s。那他如何设置任意密码 p2,同样能映射到 s...
msg7086
2017-08-24 01:48:32 +08:00
@blankme 不需要映射到 s。
只需要 f(p1)和 f(p2)都能被 g(s)确认就行。
blankme
2017-08-24 01:57:55 +08:00
@msg7086
你说的“确认”是什么意思?确认就是=的意思吧。。。
就假设你说的确认是另一个函数 h 好了
f(p1) = h(g(s)) -> g^-1(h^-1(f(p1))) = s
msg7086
2017-08-24 02:17:33 +08:00
@blankme 比如说 g(s) 得到一个数组,同时包含 f(p1) 和 f(p2)。只需要 Array.include? 即可确认。
msg7086
2017-08-24 02:20:40 +08:00
PS: 其实这不是伪需求。
大概在十年前的时候,有个网页城建游戏 Travian,其中有个机制叫做代管,即是设置另外一个密码并把账号交给别人管理,相比主密码来说权限有限制(比如不能进行自毁操作,不能内购等等),这就是典型的多密码登录需求。
blankme
2017-08-24 02:27:34 +08:00
@msg7086
这种方法和楼主提到的两个密码(加密字段)连在一起并没区别。
把多组数据存到一个单元里,或存到多个单元里,只是选用的数据结构,或者说实现方法不一样。理论上是等价的。。。
geelaw
2017-08-24 03:32:36 +08:00
@blankme 考虑一个简单加盐的方法,每个用户有一个盐 s 和两个密码 p1, p2,hash H 的输出是定长,密码在数据库里面用

H(p1s)H(p2s)

存储,通过验证当且仅当传入的密码 p 使 H(ps) 是这个存储的值的前缀或后缀。

楼主需要定义什么叫“数学上的算法”,才能获得自己满意的解答(当然前提是题主需要知道什么样的解答“令自己满意”且能够表达出来),因为拼接字符串也是数学的。
willakira
2017-08-24 03:56:05 +08:00
存成多条数据最好
查询的时候需要 hash(user+password)
你这样连在一起存的话,以后要管理不同密码权限的时候就麻烦了
msg7086
2017-08-24 04:51:01 +08:00
我想了一下。
假如密码 Hash 以后是 16 字节数据的话。
要把两个 16 字节数据存进单个 16 字节的存储器。
本身从信息学角度来说就已经不可能了吧。
huluhulu
2017-08-24 08:42:03 +08:00
10 楼是对的,针对 15 楼的疑问,可用缩短 hash 长度,或者增大密码表长度限制解决。
debye
2017-08-24 08:48:31 +08:00
需求的前面部分合理,就是可以有多密码
后面要一个字段存储不合理,为了后期扩展权限等功能,可以建立一个独立的表来存储密码
lrh3321
2017-08-24 08:52:19 +08:00
@msg7086 代管账号权限受限制了的话,不就相当于搞了个子账号给别人用吗。用代管的密码登上去的和原账号不等价啊。
FanWall
2017-08-24 09:27:11 +08:00
和 secret sharing 很相似?数据在三维的某个点,通过包含这个点的任意三个平面就可以确定这个点

但是这种一般是派发密钥给用户的
zhongkouwei
2017-08-24 09:34:08 +08:00
楼主的意思是:是否存在某种数学关系,使 f(x1)=y 同时 f(x2)=y。应该是种非对称加密,但是没有好的办法

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

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

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

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

© 2021 V2EX