对加密算法不熟悉,只知道一些简单的概念,比如 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 个字符长度,会不会太少,导致不同的内容加密结果一样的情况出现呢?哪位老哥能帮忙解答下,或者提供一些关键词让我进一步学习。先行谢过🙏
1
baiyi 2022-02-21 20:51:13 +08:00 1
哈希算法
哈希碰撞 |
2
wevsty 2022-02-21 20:52:42 +08:00 1
digest_size 指定了你需要的 digest 长度,最长可以到 64bytes 。
另外任何 hash 算法都无法保证绝对不会冲撞,所谓安全的 hash 算法只能保证不能人工刻意产生出冲撞,并且产生自然冲撞的概率极低(低到忽略不计) |
4
renmu123 2022-02-21 20:57:45 +08:00 via Android 1
34*34*34=39304 三个字符最多能表达这么多
|
6
CEBBCAT 2022-02-21 23:24:27 +08:00 1
先纠正一下,SHA256 、MD5 等属于哈希算法
我想问一下,楼主你需要的确定是哈希算法吗?简单地编码可以吗?比如 base36 |
7
dzdh 2022-02-21 23:29:14 +08:00 1
同推荐 编码替换 (但是编码本只有你自己知道那跟加密差不多了)
电话只有 0-9 可以用 a-z 替换 a=189, b=110 ab=189110 啥的 |
8
BrettD 2022-02-22 01:29:54 +08:00 via iPhone 1
sha256 是摘要,不是加密
|
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 |
10
msg7086 2022-02-22 04:22:36 +08:00 1
「加密」必然是双向的。
「单向」必然不是加密解密。这种叫做 Hash 哈希(或者摘要)。 加密不会丢失信息,哈希一定会丢失信息,而且大多数时候哈希都会导致碰撞(但是碰撞的几率很小)。 如果用空间比较大的哈希算法,比如 SHA256 这样的算法去处理电话号码,一般不会产生碰撞,因为空间差距太大了。 不过,「保证不同的内容加密结果不一样」,就意味着可以产生一对一映射,就意味着可以反推出原始内容。 |
11
xiadong1994 2022-02-22 05:58:28 +08:00 via iPhone 1
xyz 问题,你不如先说你的需求是什么,是防篡改?还是数据校验?还是啥。
|
12
Perry 2022-02-22 06:33:39 +08:00 via iPhone 3
这个需求是哪个产品经理想的?
|
13
sudoy OP @CEBBCAT 不一定要哈希算法,只要求( 1 )加密结果只能是数字和小写字母,不能有特殊字符;( 2 )不同内容加密结果不一样。根据楼上的朋友提示,实际上哈希算法存在碰撞,虽然几率很小,但是希算法不是最完美
|
14
sudoy OP |
15
sudoy OP @xiadong1994 是为了改变内容展现形式,也就是以字母数字展现,并不需要加密
|
16
sutra 2022-02-22 09:03:55 +08:00
|
17
keyfunc 2022-02-22 09:19:42 +08:00
我觉得你需要的是替换压缩。。。
|
18
leavic 2022-02-22 10:46:27 +08:00
36x36x36=46,656
这不重复都见鬼了 |
19
xiadong1994 2022-02-22 13:40:56 +08:00 via iPhone
@sudoy base64
|