
直接贴测试代码
import base64 p = b'123456' print('password: %s' % p) salt = b'84' print('salt: %s' % salt) print('reverser:') p = p[::-1] print(p) print('encode:') p = base64.b64encode(p, salt) print(p) print('reverser:') p = p.strip(b'=')[::-1] print(p) print('encode:') p = base64.b64encode(p, salt) print(p) print('reverser:') p = p.strip(b'=')[::-1] print(p) print('\ndecode password') print('reverser:') rp = p[::-1] + b'==' print(rp) print('decode:') rp = base64.b64decode(rp, salt) print(rp) print('reverser:') rp = rp[::-1] + b'==' print(rp) print('decode:') rp = base64.b64decode(rp, salt) print(rp) print('reverser:') rp = rp[::-1] print(rp) 输出结果:
encode: NjU0MzIx reverser: xIzM0UjN encode: eEl6TTBVak4= reverser: 4kaVBTT6lEe decode password reverser: eEl6TTBVak4== decode: xIzM0UjO reverser: OjU0MzIx== decode: :54321 reverser: 12345: 在第一次反转解码的时候就出错了, 本来是想在 sqlite 里保存一些可逆的加密字符
想着两次 b64 反转加密应该不容易猜, 结果这个 salt 就出了问题
不指定 salt, 就不会出先这种问题
现在想问一下, 有哪些好用的可逆的加密库, 最好是标准库
1 across Aug 24, 2020 不是,你们都拿 base64 加密的啊, 不都用 AES ? |
4 cloverzrg2 Aug 24, 2020 base64 不是加密算法,是编码,相当于 url_encode |
5 jenlors Aug 24, 2020 编码和加密不是一个概念 |
6 CSM Aug 24, 2020 via Android 首先 base64 不是加密,其次数据库不应该保存密码,加密后的也不行,应该保存不可逆的哈希 |
7 across Aug 24, 2020 @firejoke 看了下代码。原来是涉及用户密码,那根本用错道了。 设定好不可逆摘要,比如本地将密码做 hash 处理,发送给服务器,服务器登录验证从来都是 hash 的值,密码原文只会在用户自己手里。 |
8 hwdef Aug 24, 2020 可逆加密也就是 aes 了,不过 aes 应该是有一些限制,所以很多语言都没有标准库。 原理都在那,自己写也不是不可以。。。 base64 用来加密这种,,,无力吐槽,, 而且就算你用了正确的加密算法,,你加密一次,两次,n 次,都是没区别的,选择一个你信任的,加密一次就够了。。加密 n 次是浪费算力。 |
9 binux Aug 24, 2020 首先就不批评你自创加密算法的问题了 你 altchars 当成是 salt 是什么鬼?还用的是两个原本编码表里面就有的字符,那我问你 base64.b64decode('84==') 到底应该是 b'\xf3' 还是 b'\xfb'? |
10 maemual Aug 24, 2020 存密码,直接给你结论,用 bcrypt 吧 |
11 firejoke OP |
13 lewis89 Aug 24, 2020 一般都是这样的.. md5(md5(passwd)+ salt) 另外 摘要算法 编码算法 加解密算法(非对称 /对称) 要分清楚.. |
14 cloverzrg2 Aug 24, 2020 bcypt 不可逆 |
15 cloverzrg2 Aug 24, 2020 bcrypt |
16 guanhui07 Aug 24, 2020 编码可逆,加密不可逆 |
17 wangkun025 Aug 24, 2020 楼主 ID 不错。 |
18 todd7zhang Aug 24, 2020 altchars 啊,这个只是拿来给 url_safe_b64encode 干的啊,你当 salt 使... |
20 muzuiget Aug 24, 2020 base64.b64encode 第二个参数是 altchars 啊大佬。 |
21 abc612008 Aug 24, 2020 @lewis89 2020 年还 md5 呢? bcrypt 和 argon2 了解下 回 lz:永远不要试图自己自创加密算法。要加密(而且还需要能解密)就 AES,而且如果要保证绝对安全,解密的密钥不能存在服务器里。另外没有听说过加密的时候还加盐的。 |
22 lewis89 Aug 24, 2020 @abc612008 #21 md5 还行吧,主要是大部分机器直接硬件支持,另外 密码这东西,说白了真要泄漏了,也没办法,当然 salt 分开放 基本上可以大幅度降低风险,除非对面 真的渗透到你的服务或者配置中心的机器,把你内存 dump 下来,那神仙也救不了。 |
23 abc612008 Aug 25, 2020 @lewis89 先不提 md5 早就可以碰撞了,光是 md5 现在运算速度这么快就不适合作为密码 hash 。密码 hash 很重要的一个衡量标准就是慢,导致攻击成本高。在一个密码学设计的良好的系统里,就算你所有的代码 /算法以及数据库都被攻击者获取了,也无法在合理的时间成本之内破解系统。salt 分开存储、混淆代码等并没有办法在本质上让你的系统变安全,最多只是拖延一点时间,给攻击者稍微多一点工作量而已。 |
&bsp; 24 firejoke OP @abc612008 #21 @abc612008 #23 我不是加密密码 , 就是不想在 sqlit 里保存明文, 掩盖一下.@todd7zhang #18 @muzuiget #20 理解错参数了...... |
25 unco020511 Aug 25, 2020 @guanhui07 严格来说你这句话后半段是个很大的错误,加密是将明文通过某种算法变成密文,并且后续可以通过解密来获取原文,所以加密必定是可逆的,hash(常见的比如 MD5,SHA1,SHA256)是一种摘要算法,你可以上外网看看,一般是不会说什么"MD5 加密"/"不可逆加密"/"不可逆加密算法";哈希( Hash )是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密( Encrypt )是将目标文本转换成具有不同长度的、可逆的密文。 |
26 guanhui07 Aug 25, 2020 @unco020511 嗯 不可逆的是摘要 |
27 liantao Aug 25, 2020 我也干过这类事,反转后 base64 encode 10 次。。。就很好奇这样别人还破解么? |