如题: 有一个需求 就是想把用户的手机号用 rsa 加密 数据库里面存的是加密后的数据如:KW/sZMV+cLiqeLqZ9YAb3OvXVOrxd6MrebdqSPCbAZVmP/00As6zKpQvQ0hJjoT1aJSXfErX2kpEpm89jaf00A==
但是这样的话 如果登录用手机号登录咋整呢 不可能查整个用户表去一个一个解密 在比对吧?
两难的选择,请求大佬给个好点的思路 我想了很久 没想到好的办法
1
xujinkai 2021-01-02 21:53:03 +08:00 via Android
再存个 hash 值?
|
2
zonyitoo 2021-01-02 21:55:19 +08:00
把手机号再用同样的密钥加密一次再传过来比对不就好了?如果没加盐的话
|
3
xxbutoo OP |
5
jzmws 2021-01-02 22:08:43 +08:00
看到这个 ,也启发了我 , 我也在代码里面傻傻的把密码加密了 。 存密码时候同时存一个明文的 hash 值
保存 1. 数据库中手机号=rsa (手机号) 2.保存 hash =md5 (手机号) 这个数据库中就有一个加密的手机号和手机号对用的 hash 值 使用时候 用 md5 (手机号) 的 hash 值获取对应记录,然后在解密手机号后对比 如果考虑到 md5 加密不安全,加盐 或者用对称加密 楼主这个是搞金融? 非对称加密的每次结果都是不一样的 |
7
wdlth 2021-01-02 22:11:22 +08:00 2
为什么要用 RSA 这种非对称算法做加密呢?用对称算法不行么?
|
8
Aoang 2021-01-02 22:11:49 +08:00 via Android
需要使用手机号登录,为啥还折腾加密哈希?伪需求吧
没什么思路好说的,只有明文或类明文才能实现。 否则只要是加盐的哈希,只能查全表来匹配。 |
9
xxbutoo OP @jzmws 确实,我考虑很久 也决定不用 rsa 加密了,用 aes 就行
主要是登录的时候 需要用明文去匹配数据库存储的值 rsa 的话安全是保障了 但是一旦用 rsa 加密了手机号,登录的时候就蛋疼了,只能用 aes 加密 可以用加密后的数据去匹配数据库中的字段 |
11
inframe 2021-01-02 22:42:21 +08:00
字段用同一个 rsa 公钥加密就好,非得每行每个字段都用不同的公钥那就没办法了。。。
|
12
eason1874 2021-01-02 22:45:27 +08:00
想过这个问题,每个手机号前面三位后面两位作为明文提示,中间六位加唯一盐存哈希值,不幸泄露被硬破的话,每个号码有一百万种可能
|
13
opengps 2021-01-02 23:03:03 +08:00
加密对比啊,跟 md5 密码单向加密一样用。比较密文即可
|
16
zonyitoo 2021-01-02 23:49:10 +08:00
对称加密相同输入,输出肯定相同啊。怎么会不同呢?
|
17
msg7086 2021-01-02 23:50:01 +08:00 via Android
登录存一份哈希就行了,多大点事…
|
18
wolong 2021-01-03 01:33:40 +08:00
用手机号登录,那手机号就是账号,没必要加密啊
|
20
Co1a 2021-01-03 02:29:05 +08:00 via iPhone
没有搞懂 Point,还请指教。
1.用户隐私起见:手机号应该是特定的场景下才会 Query,而不是当作 Username 。且,若使用 RSA 加密,公钥与私钥的分配是怎样的?掌握在用户手里还是自己手里?看见 Tag 里的 Go,莫非是 Blockchain ? 2.业务起见:对手机号进行加密在保证性能的评价下,有且只有给予用户 id 的方法来保证速度,换个思路,有没有可能 Register 时直接使用 GPG 生成密钥,敏感时使用服务器 Gennerate 一个文件(实时更新且设定过期),使用 gpg 签名后,服务端解密并查表确认用户身份?(最近迷上了密码学,有些天马行空的想法,哈哈) |
21
nvkou 2021-01-03 03:30:21 +08:00 via Android
用户有私钥和没私钥是 2 回事。
如果用户有私钥,rsa 加密就变成解题。可以配合手机验证码验证身份。 用户没私钥的话,安全责任又在服务器这里的话为什么不选择对称加密呢? |
22
kaiki 2021-01-03 05:03:30 +08:00
需求拆分下,你的需求就是两个了,第一个是手机号用 rsa 加密存入数据库,第二个是手机号登录验证,所以第二个需求你不用非对称加密就行
|
23
loading 2021-01-03 09:19:08 +08:00 via Android
还不如用 md5 呢,这样就密码泄露了还不至于把用户的直接也丢了(当然跑一次也很简单)
|
24
xuanbg 2021-01-03 09:54:51 +08:00
就是 1 楼的方法,再存一个手机号的 hash 。
|
25
xuanbg 2021-01-03 09:55:45 +08:00
手机号明文的 hash,密文再 hash 有个鸟用。
|
26
loading 2021-01-03 09:58:52 +08:00 via Android
如果你觉得直接 md5 不够“安全”,建议加 salt 后再 md5,然后这个盐你自己爱怎么保护就怎么保护,效果差不多。
|
27
dorothyREN 2021-01-03 09:59:24 +08:00
手机号 有必要加密???
|
28
SuperMild 2021-01-03 10:04:17 +08:00
不管你用什么加密方式,用到的密钥从哪里获取?
如果密钥就在服务器里,这和明文保存有什么区别? 如果要保护隐私,想来想去只有两个办法:1.不要用手机号登录; 2.手机号像密码一样存哈希值(比较耗资源)。 哈希不是加密,但如果你把密钥和密文放在同一个地方,则是比哈希更糟糕。 |
29
3dwelcome 2021-01-03 11:39:19 +08:00 via Android
RSA 有两种算法,一种是加密,一种是签名。你想每次加密后 hash 值不变,用签名就可以。
加密算法无非是加入随机数,让每次结果不一样。 |
30
viakiba 2021-01-03 11:54:32 +08:00 via iPhone
变的原因是应该 padding 算法 使用零填充试试
|
31
viakiba 2021-01-03 11:55:32 +08:00 via iPhone
其实怕 hash 碰撞出来 可以考虑 hmac
|
32
Takuron 2021-01-03 12:13:24 +08:00
|
33
mikeguan 2021-01-03 12:17:44 +08:00 via Android
现在怎样判断手机号重复注册的问题
|
34
idoggy 2021-01-03 12:28:47 +08:00 via Android
传到后台的时候解下密存成 hash,这样搞简单也不算不合规,毕竟人眼看见的不是明文。
|
36
Stain5 2021-01-03 15:03:46 +08:00
@idoggy 可以直接把 hash 后的值给 NSA 吗,10 个数字的话,假设一秒钟能尝试 1000 次,算一个月就能跑出来了
|
37
niubee1 2021-01-03 15:12:53 +08:00
这个设计简直是............... 这么存和存明文有什么区别?
|
38
dotw2x 2021-01-03 20:56:00 +08:00 via iPhone
除非有明确要求要达到某加密级别,否则考虑 RSA 的加密效率和复杂性,用 RSA 来做验签的场景更多一点,手机号或证件号等敏感信息还要涉及登录用哈希加盐更适合。
|
39
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) |
40
vc1 2021-01-03 22:01:40 +08:00
不太明白这需求的出发点和目的是什么,先搞明白需求,再改设计
|
41
LYaoYao 2021-01-04 09:56:25 +08:00
登陆的时候将手机号先用 rsa 加密对比下是否一致不行吗
|
42
lllllliu 2021-01-04 17:17:13 +08:00
我想了想,我要调用第三方短信接口的时候应该怎么办呢🤔
|
43
CantSee 2021-01-04 18:30:41 +08:00
我存的 base64..
|