V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
xxbutoo
V2EX  ›  Go 编程语言

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

  •  
  •   xxbutoo · 2021-01-02 21:47:45 +08:00 · 5132 次点击
    这是一个创建于 1181 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    43 条回复    2021-01-04 18:30:41 +08:00
    xujinkai
        1
    xujinkai  
       2021-01-02 21:53:03 +08:00 via Android
    再存个 hash 值?
    zonyitoo
        2
    zonyitoo  
       2021-01-02 21:55:19 +08:00
    把手机号再用同样的密钥加密一次再传过来比对不就好了?如果没加盐的话
    xxbutoo
        3
    xxbutoo  
    OP
       2021-01-02 21:56:19 +08:00
    @zonyitoo 关键是数据库存的是加密后的哈希值,
    用户输入的是明文,哈希值每次都不一样的
    这咋写 where 条件啊,用明文去匹配加密后的值 行不通呀
    xxbutoo
        4
    xxbutoo  
    OP
       2021-01-02 21:56:53 +08:00
    @xujinkai 主要是哈希值每次结果都不一样
    jzmws
        5
    jzmws  
       2021-01-02 22:08:43 +08:00
    看到这个 ,也启发了我 , 我也在代码里面傻傻的把密码加密了 。 存密码时候同时存一个明文的 hash 值
    保存
    1. 数据库中手机号=rsa (手机号)
    2.保存 hash =md5 (手机号)
    这个数据库中就有一个加密的手机号和手机号对用的 hash 值

    使用时候
    用 md5 (手机号) 的 hash 值获取对应记录,然后在解密手机号后对比

    如果考虑到 md5 加密不安全,加盐 或者用对称加密


    楼主这个是搞金融?

    非对称加密的每次结果都是不一样的
    jzmws
        6
    jzmws  
       2021-01-02 22:09:28 +08:00
    @xxbutoo 你存的时候算 手机号的 哈希值 ,不是加密后的
    wdlth
        7
    wdlth  
       2021-01-02 22:11:22 +08:00   ❤️ 2
    为什么要用 RSA 这种非对称算法做加密呢?用对称算法不行么?
    Aoang
        8
    Aoang  
       2021-01-02 22:11:49 +08:00 via Android
    需要使用手机号登录,为啥还折腾加密哈希?伪需求吧

    没什么思路好说的,只有明文或类明文才能实现。
    否则只要是加盐的哈希,只能查全表来匹配。
    xxbutoo
        9
    xxbutoo  
    OP
       2021-01-02 22:17:58 +08:00
    @jzmws 确实,我考虑很久 也决定不用 rsa 加密了,用 aes 就行
    主要是登录的时候 需要用明文去匹配数据库存储的值
    rsa 的话安全是保障了 但是一旦用 rsa 加密了手机号,登录的时候就蛋疼了,只能用 aes 加密 可以用加密后的数据去匹配数据库中的字段
    jzmws
        10
    jzmws  
       2021-01-02 22:23:15 +08:00
    @xxbutoo 用 RSA 和 AES 两个一起做吧 因为 你把手机号加密了 肯定不好搞
    inframe
        11
    inframe  
       2021-01-02 22:42:21 +08:00
    字段用同一个 rsa 公钥加密就好,非得每行每个字段都用不同的公钥那就没办法了。。。
    eason1874
        12
    eason1874  
       2021-01-02 22:45:27 +08:00
    想过这个问题,每个手机号前面三位后面两位作为明文提示,中间六位加唯一盐存哈希值,不幸泄露被硬破的话,每个号码有一百万种可能
    opengps
        13
    opengps  
       2021-01-02 23:03:03 +08:00
    加密对比啊,跟 md5 密码单向加密一样用。比较密文即可
    dzdh
        14
    dzdh  
       2021-01-02 23:47:10 +08:00
    @wdlth 对称加密 aes 每次加密后的结果也是不同的
    dzdh
        15
    dzdh  
       2021-01-02 23:48:03 +08:00
    @opengps md5 不是摘要算法么
    zonyitoo
        16
    zonyitoo  
       2021-01-02 23:49:10 +08:00
    对称加密相同输入,输出肯定相同啊。怎么会不同呢?
    msg7086
        17
    msg7086  
       2021-01-02 23:50:01 +08:00 via Android
    登录存一份哈希就行了,多大点事…
    wolong
        18
    wolong  
       2021-01-03 01:33:40 +08:00
    用手机号登录,那手机号就是账号,没必要加密啊
    opengps
        19
    opengps  
       2021-01-03 01:44:53 +08:00 via Android
    @dzdh 用于文件检验是摘要,用于密码不可逆加密算加密算法
    Co1a
        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 签名后,服务端解密并查表确认用户身份?(最近迷上了密码学,有些天马行空的想法,哈哈)
    nvkou
        21
    nvkou  
       2021-01-03 03:30:21 +08:00 via Android
    用户有私钥和没私钥是 2 回事。
    如果用户有私钥,rsa 加密就变成解题。可以配合手机验证码验证身份。
    用户没私钥的话,安全责任又在服务器这里的话为什么不选择对称加密呢?
    kaiki
        22
    kaiki  
       2021-01-03 05:03:30 +08:00
    需求拆分下,你的需求就是两个了,第一个是手机号用 rsa 加密存入数据库,第二个是手机号登录验证,所以第二个需求你不用非对称加密就行
    loading
        23
    loading  
       2021-01-03 09:19:08 +08:00 via Android
    还不如用 md5 呢,这样就密码泄露了还不至于把用户的直接也丢了(当然跑一次也很简单)
    xuanbg
        24
    xuanbg  
       2021-01-03 09:54:51 +08:00
    就是 1 楼的方法,再存一个手机号的 hash 。
    xuanbg
        25
    xuanbg  
       2021-01-03 09:55:45 +08:00
    手机号明文的 hash,密文再 hash 有个鸟用。
    loading
        26
    loading  
       2021-01-03 09:58:52 +08:00 via Android
    如果你觉得直接 md5 不够“安全”,建议加 salt 后再 md5,然后这个盐你自己爱怎么保护就怎么保护,效果差不多。
    dorothyREN
        27
    dorothyREN  
       2021-01-03 09:59:24 +08:00
    手机号 有必要加密???
    SuperMild
        28
    SuperMild  
       2021-01-03 10:04:17 +08:00
    不管你用什么加密方式,用到的密钥从哪里获取?

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

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

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

    @Co1a 还不是我朝,普通用户都习惯直接用手机号登录你能不搞?李彦宏说的有道理的。
    mikeguan
        33
    mikeguan  
       2021-01-03 12:17:44 +08:00 via Android
    现在怎样判断手机号重复注册的问题
    idoggy
        34
    idoggy  
       2021-01-03 12:28:47 +08:00 via Android
    传到后台的时候解下密存成 hash,这样搞简单也不算不合规,毕竟人眼看见的不是明文。
    wdlth
        35
    wdlth  
       2021-01-03 12:42:05 +08:00
    @dzdh AES 算法在相同的分组模式、填充模式和参数下结果是一致的,不然怎么解密还原呢?
    Stain5
        36
    Stain5  
       2021-01-03 15:03:46 +08:00
    @idoggy 可以直接把 hash 后的值给 NSA 吗,10 个数字的话,假设一秒钟能尝试 1000 次,算一个月就能跑出来了
    niubee1
        37
    niubee1  
       2021-01-03 15:12:53 +08:00
    这个设计简直是............... 这么存和存明文有什么区别?
    dotw2x
        38
    dotw2x  
       2021-01-03 20:56:00 +08:00 via iPhone
    除非有明确要求要达到某加密级别,否则考虑 RSA 的加密效率和复杂性,用 RSA 来做验签的场景更多一点,手机号或证件号等敏感信息还要涉及登录用哈希加盐更适合。
    vc1
        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)
    vc1
        40
    vc1  
       2021-01-03 22:01:40 +08:00
    不太明白这需求的出发点和目的是什么,先搞明白需求,再改设计
    LYaoYao
        41
    LYaoYao  
       2021-01-04 09:56:25 +08:00
    登陆的时候将手机号先用 rsa 加密对比下是否一致不行吗
    lllllliu
        42
    lllllliu  
       2021-01-04 17:17:13 +08:00
    我想了想,我要调用第三方短信接口的时候应该怎么办呢🤔
    CantSee
        43
    CantSee  
       2021-01-04 18:30:41 +08:00
    我存的 base64..
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1537 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 17:01 · PVG 01:01 · LAX 10:01 · JFK 13:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.