请教关于加密算法 blake2b

2022-02-21 20:43:36 +08:00
 sudoy

对加密算法不熟悉,只知道一些简单的概念,比如 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 个字符长度,会不会太少,导致不同的内容加密结果一样的情况出现呢?哪位老哥能帮忙解答下,或者提供一些关键词让我进一步学习。先行谢过🙏

1369 次点击
所在节点    问与答
19 条回复
baiyi
2022-02-21 20:51:13 +08:00
哈希算法
哈希碰撞
wevsty
2022-02-21 20:52:42 +08:00
digest_size 指定了你需要的 digest 长度,最长可以到 64bytes 。

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

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

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

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

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

不过,「保证不同的内容加密结果不一样」,就意味着可以产生一对一映射,就意味着可以反推出原始内容。
xiadong1994
2022-02-22 05:58:28 +08:00
xyz 问题,你不如先说你的需求是什么,是防篡改?还是数据校验?还是啥。
Perry
2022-02-22 06:33:39 +08:00
这个需求是哪个产品经理想的?
sudoy
2022-02-22 08:33:23 +08:00
@CEBBCAT 不一定要哈希算法,只要求( 1 )加密结果只能是数字和小写字母,不能有特殊字符;( 2 )不同内容加密结果不一样。根据楼上的朋友提示,实际上哈希算法存在碰撞,虽然几率很小,但是希算法不是最完美
sudoy
2022-02-22 08:41:51 +08:00
@dzdh
@BrettD
@ipwx
@msg7086 谢谢各位,经过沟通,只需要替换编码即可,不需要加密
sudoy
2022-02-22 08:43:04 +08:00
@xiadong1994 是为了改变内容展现形式,也就是以字母数字展现,并不需要加密
sutra
2022-02-22 09:03:55 +08:00
keyfunc
2022-02-22 09:19:42 +08:00
我觉得你需要的是替换压缩。。。
leavic
2022-02-22 10:46:27 +08:00
36x36x36=46,656
这不重复都见鬼了
xiadong1994
2022-02-22 13:40:56 +08:00
@sudoy base64

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

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

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

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

© 2021 V2EX