手机号用 rsa 加密后存储在数据库中,如何用手机号登录?

2021-01-02 21:47:45 +08:00
 xxbutoo

如题: 有一个需求 就是想把用户的手机号用 rsa 加密 数据库里面存的是加密后的数据如:KW/sZMV+cLiqeLqZ9YAb3OvXVOrxd6MrebdqSPCbAZVmP/00As6zKpQvQ0hJjoT1aJSXfErX2kpEpm89jaf00A==

但是这样的话 如果登录用手机号登录咋整呢 不可能查整个用户表去一个一个解密 在比对吧?

两难的选择,请求大佬给个好点的思路 我想了很久 没想到好的办法

5163 次点击
所在节点    Go 编程语言
43 条回复
nvkou
2021-01-03 03:30:21 +08:00
用户有私钥和没私钥是 2 回事。
如果用户有私钥,rsa 加密就变成解题。可以配合手机验证码验证身份。
用户没私钥的话,安全责任又在服务器这里的话为什么不选择对称加密呢?
kaiki
2021-01-03 05:03:30 +08:00
需求拆分下,你的需求就是两个了,第一个是手机号用 rsa 加密存入数据库,第二个是手机号登录验证,所以第二个需求你不用非对称加密就行
loading
2021-01-03 09:19:08 +08:00
还不如用 md5 呢,这样就密码泄露了还不至于把用户的直接也丢了(当然跑一次也很简单)
xuanbg
2021-01-03 09:54:51 +08:00
就是 1 楼的方法,再存一个手机号的 hash 。
xuanbg
2021-01-03 09:55:45 +08:00
手机号明文的 hash,密文再 hash 有个鸟用。
loading
2021-01-03 09:58:52 +08:00
如果你觉得直接 md5 不够“安全”,建议加 salt 后再 md5,然后这个盐你自己爱怎么保护就怎么保护,效果差不多。
dorothyREN
2021-01-03 09:59:24 +08:00
手机号 有必要加密???
SuperMild
2021-01-03 10:04:17 +08:00
不管你用什么加密方式,用到的密钥从哪里获取?

如果密钥就在服务器里,这和明文保存有什么区别?

如果要保护隐私,想来想去只有两个办法:1.不要用手机号登录; 2.手机号像密码一样存哈希值(比较耗资源)。

哈希不是加密,但如果你把密钥和密文放在同一个地方,则是比哈希更糟糕。
3dwelcome
2021-01-03 11:39:19 +08:00
RSA 有两种算法,一种是加密,一种是签名。你想每次加密后 hash 值不变,用签名就可以。
加密算法无非是加入随机数,让每次结果不一样。
viakiba
2021-01-03 11:54:32 +08:00
变的原因是应该 padding 算法 使用零填充试试
viakiba
2021-01-03 11:55:32 +08:00
其实怕 hash 碰撞出来 可以考虑 hmac
Takuron
2021-01-03 12:13:24 +08:00
再存一个手机号明文的 hash,然后对比明文的 hash 。

@Co1a 还不是我朝,普通用户都习惯直接用手机号登录你能不搞?李彦宏说的有道理的。
mikeguan
2021-01-03 12:17:44 +08:00
现在怎样判断手机号重复注册的问题
idoggy
2021-01-03 12:28:47 +08:00
传到后台的时候解下密存成 hash,这样搞简单也不算不合规,毕竟人眼看见的不是明文。
wdlth
2021-01-03 12:42:05 +08:00
@dzdh AES 算法在相同的分组模式、填充模式和参数下结果是一致的,不然怎么解密还原呢?
Stain5
2021-01-03 15:03:46 +08:00
@idoggy 可以直接把 hash 后的值给 NSA 吗,10 个数字的话,假设一秒钟能尝试 1000 次,算一个月就能跑出来了
niubee1
2021-01-03 15:12:53 +08:00
这个设计简直是............... 这么存和存明文有什么区别?
dotw2x
2021-01-03 20:56:00 +08:00
除非有明确要求要达到某加密级别,否则考虑 RSA 的加密效率和复杂性,用 RSA 来做验签的场景更多一点,手机号或证件号等敏感信息还要涉及登录用哈希加盐更适合。
vc1
2021-01-03 21:50:49 +08:00
有两个问题:1 密文需不需要还原明文手机号? 2 每个用户是否要用不同的公私钥?

假设还原明文,是不同的公私钥,登录不能传输任何可直接还原出手机号的数据
用手机号本身生成 salt,计算出一个哈希值,hash = sha1( 固定 salt+手机号+sha1(手机号)+md5(手机号)(作为自身 salt ) )
每一条记录对应的 ras 的公钥私钥本身也需要存储对吧
用上面的 hash 值作为私钥的索引,每次登录由前端计算后回传,存在此索引表明此手机号存在,找到对应私钥解开密文得到原始手机号

上面计算的 hash 本身回传时可以再加密一次,登录页临时生成一对 rsa 的公私钥用于回传加密
如果手机号数据不用于短信等需要明文的场景,必须由用户输入手机号的操作才能还原,开发有代码有 rsa 公私钥也不能还原手机号的情况,可以在存储时,用上面 hash 值做 aes 的 key 加密后,再用 rsa 存储,rsa 私钥索引使用 sha1(hash)
vc1
2021-01-03 22:01:40 +08:00
不太明白这需求的出发点和目的是什么,先搞明白需求,再改设计

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

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

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

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

© 2021 V2EX