V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sudoy
V2EX  ›  问与答

请教关于加密算法 blake2b

  •  
  •   sudoy · 2022-02-21 20:43:36 +08:00 · 1457 次点击
    这是一个创建于 1004 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对加密算法不熟悉,只知道一些简单的概念,比如 hash256 这种属于单向加密,内容被加密完了是无法逆向解密,只能将两次加密结果进行比对,如果一致就说明被加密内容一致。

    最近有个需求,就是把用户电话进行单向加密,加密后的字符长度为 3 个字符(比如 1c8 )并且只能包含数字 0 到 9 和小写字母 a 到 z 。强调下,单向加密即可,也就是说不需要解密,只要保证不同的内容加密结果不一样就可以

    于是我就找到 hashlib 下面有 blake2b:

    from hashlib import blake2b
    h = blake2b(digest_size=20)
    h.update(b'Replacing SHA1 with the more secure function')
    h.hexdigest()
    

    来源于: https://docs.python.org/3/library/hashlib.html#using-different-digest-sizes

    这个似乎可以实现我的要求。但是我有个疑问,解密结果才 3 个字符长度,会不会太少,导致不同的内容加密结果一样的情况出现呢?哪位老哥能帮忙解答下,或者提供一些关键词让我进一步学习。先行谢过🙏

    19 条回复    2022-02-22 13:40:56 +08:00
    baiyi
        1
    baiyi  
       2022-02-21 20:51:13 +08:00   ❤️ 1
    哈希算法
    哈希碰撞
    wevsty
        2
    wevsty  
       2022-02-21 20:52:42 +08:00   ❤️ 1
    digest_size 指定了你需要的 digest 长度,最长可以到 64bytes 。

    另外任何 hash 算法都无法保证绝对不会冲撞,所谓安全的 hash 算法只能保证不能人工刻意产生出冲撞,并且产生自然冲撞的概率极低(低到忽略不计)
    sudoy
        3
    sudoy  
    OP
       2022-02-21 20:55:39 +08:00
    @baiyi
    @wevsty 谢谢两位!考虑到冲撞的概率,那 digest 长度长一点应该就是冲撞概率低一些了
    renmu123
        4
    renmu123  
       2022-02-21 20:57:45 +08:00 via Android   ❤️ 1
    34*34*34=39304 三个字符最多能表达这么多
    sudoy
        5
    sudoy  
    OP
       2022-02-21 21:00:52 +08:00
    @renmu123 就是说我得根据用户数量考虑是否增加字符长度,以便降低冲撞概率
    CEBBCAT
        6
    CEBBCAT  
       2022-02-21 23:24:27 +08:00   ❤️ 1
    先纠正一下,SHA256 、MD5 等属于哈希算法

    我想问一下,楼主你需要的确定是哈希算法吗?简单地编码可以吗?比如 base36
    dzdh
        7
    dzdh  
       2022-02-21 23:29:14 +08:00   ❤️ 1
    同推荐 编码替换 (但是编码本只有你自己知道那跟加密差不多了)

    电话只有 0-9 可以用 a-z 替换 a=189, b=110 ab=189110 啥的
    BrettD
        8
    BrettD  
       2022-02-22 01:29:54 +08:00 via iPhone   ❤️ 1
    sha256 是摘要,不是加密
    ipwx
        9
    ipwx  
       2022-02-22 01:50:53 +08:00   ❤️ 1
    按照楼主的 3 个字符哈希算法,当有 100 个手机号时发生哈希冲突的概率就有 12%,500 个就是 95.8%。。。

    https://zh.wikipedia.org/wiki/%E7%94%9F%E6%97%A5%E5%95%8F%E9%A1%8C
    msg7086
        10
    msg7086  
       2022-02-22 04:22:36 +08:00   ❤️ 1
    「加密」必然是双向的。
    「单向」必然不是加密解密。这种叫做 Hash 哈希(或者摘要)。

    加密不会丢失信息,哈希一定会丢失信息,而且大多数时候哈希都会导致碰撞(但是碰撞的几率很小)。
    如果用空间比较大的哈希算法,比如 SHA256 这样的算法去处理电话号码,一般不会产生碰撞,因为空间差距太大了。

    不过,「保证不同的内容加密结果不一样」,就意味着可以产生一对一映射,就意味着可以反推出原始内容。
    xiadong1994
        11
    xiadong1994  
       2022-02-22 05:58:28 +08:00 via iPhone   ❤️ 1
    xyz 问题,你不如先说你的需求是什么,是防篡改?还是数据校验?还是啥。
    Perry
        12
    Perry  
       2022-02-22 06:33:39 +08:00 via iPhone   ❤️ 3
    这个需求是哪个产品经理想的?
    sudoy
        13
    sudoy  
    OP
       2022-02-22 08:33:23 +08:00 via iPhone
    @CEBBCAT 不一定要哈希算法,只要求( 1 )加密结果只能是数字和小写字母,不能有特殊字符;( 2 )不同内容加密结果不一样。根据楼上的朋友提示,实际上哈希算法存在碰撞,虽然几率很小,但是希算法不是最完美
    sudoy
        14
    sudoy  
    OP
       2022-02-22 08:41:51 +08:00 via iPhone
    @dzdh
    @BrettD
    @ipwx
    @msg7086 谢谢各位,经过沟通,只需要替换编码即可,不需要加密
    sudoy
        15
    sudoy  
    OP
       2022-02-22 08:43:04 +08:00 via iPhone
    @xiadong1994 是为了改变内容展现形式,也就是以字母数字展现,并不需要加密
    keyfunc
        17
    keyfunc  
       2022-02-22 09:19:42 +08:00
    我觉得你需要的是替换压缩。。。
    leavic
        18
    leavic  
       2022-02-22 10:46:27 +08:00
    36x36x36=46,656
    这不重复都见鬼了
    xiadong1994
        19
    xiadong1994  
       2022-02-22 13:40:56 +08:00 via iPhone
    @sudoy base64
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5321 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:42 · PVG 15:42 · LAX 23:42 · JFK 02:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.