现在有一个伪需求,按道理来讲是不可能提出来的,但是也可以想想。
需求: 设计一个密码储存的方式可以支持两个密码登陆同一个账户,但是密码的储存只能用一个字段。
直接能想到的就是可以把两个密码用分隔符连在一起,但是除了这种方式还有什么更好的方案么?有没有啥数学上的算法是支持的?
1
misaka20038numbe 2017-08-23 23:43:36 +08:00 1
新增除密码不一样其他都一样的行。
|
2
frankyzf 2017-08-24 00:25:20 +08:00 via Android 1
密码单独建张表?
|
3
widewing 2017-08-24 01:06:59 +08:00 via Android 1
直接连的方案哪儿不好了?
|
4
lydasia 2017-08-24 01:12:33 +08:00 via iPhone 1
数学上?两个大质数的积这种?
|
5
qiayue 2017-08-24 01:13:26 +08:00 1
不需要根据密码来查询账户,所以连在一起是最好的办法
而且如果密码处理成同样位数字符串,连接符都不需要,直接根据长度切分就可以 |
6
SpikeKnox 2017-08-24 01:15:34 +08:00 via Android 1
反向想下,手机号或用户名同一密码都能登录。存法不同,当 ID 是密码,I 手机号和用户名就是两个不同密码
|
7
blankme 2017-08-24 01:26:27 +08:00 via Android 1
不可能的
你所存储的字段最基本的要求是,无法反推出密码 假设用户设置了密码 p1,映射到字段 s。那他如何设置任意密码 p2,同样能映射到 s... |
9
blankme 2017-08-24 01:57:55 +08:00 1
|
10
msg7086 2017-08-24 02:17:33 +08:00 1
@blankme 比如说 g(s) 得到一个数组,同时包含 f(p1) 和 f(p2)。只需要 Array.include? 即可确认。
|
11
msg7086 2017-08-24 02:20:40 +08:00 1
PS: 其实这不是伪需求。
大概在十年前的时候,有个网页城建游戏 Travian,其中有个机制叫做代管,即是设置另外一个密码并把账号交给别人管理,相比主密码来说权限有限制(比如不能进行自毁操作,不能内购等等),这就是典型的多密码登录需求。 |
12
blankme 2017-08-24 02:27:34 +08:00 via Android 1
|
13
geelaw 2017-08-24 03:32:36 +08:00 1
@blankme 考虑一个简单加盐的方法,每个用户有一个盐 s 和两个密码 p1, p2,hash H 的输出是定长,密码在数据库里面用
H(p1s)H(p2s) 存储,通过验证当且仅当传入的密码 p 使 H(ps) 是这个存储的值的前缀或后缀。 楼主需要定义什么叫“数学上的算法”,才能获得自己满意的解答(当然前提是题主需要知道什么样的解答“令自己满意”且能够表达出来),因为拼接字符串也是数学的。 |
14
willakira 2017-08-24 03:56:05 +08:00 1
存成多条数据最好
查询的时候需要 hash(user+password) 你这样连在一起存的话,以后要管理不同密码权限的时候就麻烦了 |
15
msg7086 2017-08-24 04:51:01 +08:00 1
我想了一下。
假如密码 Hash 以后是 16 字节数据的话。 要把两个 16 字节数据存进单个 16 字节的存储器。 本身从信息学角度来说就已经不可能了吧。 |
16
huluhulu 2017-08-24 08:42:03 +08:00 via iPhone 1
10 楼是对的,针对 15 楼的疑问,可用缩短 hash 长度,或者增大密码表长度限制解决。
|
17
debye 2017-08-24 08:48:31 +08:00 1
需求的前面部分合理,就是可以有多密码
后面要一个字段存储不合理,为了后期扩展权限等功能,可以建立一个独立的表来存储密码 |
19
FanWall 2017-08-24 09:27:11 +08:00 via Android 1
和 secret sharing 很相似?数据在三维的某个点,通过包含这个点的任意三个平面就可以确定这个点
但是这种一般是派发密钥给用户的 |
20
zhongkouwei 2017-08-24 09:34:08 +08:00 1
楼主的意思是:是否存在某种数学关系,使 f(x1)=y 同时 f(x2)=y。应该是种非对称加密,但是没有好的办法
|
21
tscat 2017-08-24 09:40:23 +08:00 1
只能间接的存两个密码
|
22
lixiangzaizheli 2017-08-24 09:41:00 +08:00 1
一楼挺好的 除了数据量会大一点 验证后识别为同一用户就好了
|
23
ruchee 2017-08-24 09:47:23 +08:00 1
单独建表比较合理,防备以后有可能的扩展需求
|
24
hekunhotmail 2017-08-24 09:47:36 +08:00 1
分隔符 存一个字段里 然后代码处理喽
|
25
whatafuck 2017-08-24 09:50:03 +08:00 1
哈哈,其实就是,主密码和观看密码,主密码有一切权限,观看密码只能观看不能操作。。right ?
|
26
jyf 2017-08-24 09:51:36 +08:00 1
没有什么存储上的问题 一般大系统的用户登录都只是根据账户密码来获取一个认证与对应的用户 id 而已
假如你的 认证表里的字段有三个 比如 alias, password, uid ,alias 是账户名称, password 是密码 uid 是用户 id 把 alias,password 做个联合的 unique 那这个直接存储即可 没有啥难点 |
27
ioth 2017-08-24 09:51:37 +08:00 1
你们公司负责需求的是伪娘吗?
|
28
wweir 2017-08-24 09:58:08 +08:00 via Android 1
那么问题来了,真的只要存两个密码吗?
真?那签个需求不变动协议,不为别的,就为计算工作量+方便打脸 假?那要存几个密码? 有固定数字,那就该用固定的列来存,该撕逼撕逼,该改表结构改表结构。 不知道要存几个,那还是老老实实字符拼接吧,其它实现未必就简单。记得拼接字符用不可作为密码的字符 |
29
wq2016 2017-08-24 10:13:21 +08:00 2
密码和用户字段互换
密码作为真正的用户名字段 而用户名作为密码字段,用户名可以多个 |
30
Victor215 OP 想了想,看来还是再来一张映射表是最佳的选择。
|