base64 两次反转加密后, 逆向解码不一致

2020-08-24 13:21:45 +08:00
 firejoke

直接贴测试代码

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, 就不会出先这种问题
现在想问一下, 有哪些好用的可逆的加密库, 最好是标准库

4620 次点击
所在节点    Python
27 条回复
across
2020-08-24 13:26:38 +08:00
不是,你们都拿 base64 加密的啊, 不都用 AES ?
firejoke
2020-08-24 13:28:11 +08:00
@across #1 想着直接用标准库......
xuanbg
2020-08-24 13:33:47 +08:00
@firejoke base64 只是编码,没有加解密的功能啊
cloverzrg2
2020-08-24 13:33:55 +08:00
base64 不是加密算法,是编码,相当于 url_encode
jenlors
2020-08-24 13:39:28 +08:00
编码和加密不是一个概念
CSM
2020-08-24 13:40:56 +08:00
首先 base64 不是加密,其次数据库不应该保存密码,加密后的也不行,应该保存不可逆的哈希
across
2020-08-24 13:46:02 +08:00
@firejoke 看了下代码。原来是涉及用户密码,那根本用错道了。
设定好不可逆摘要,比如本地将密码做 hash 处理,发送给服务器,服务器登录验证从来都是 hash 的值,密码原文只会在用户自己手里。
hwdef
2020-08-24 13:46:17 +08:00
可逆加密也就是 aes 了,不过 aes 应该是有一些限制,所以很多语言都没有标准库。
原理都在那,自己写也不是不可以。。。


base64 用来加密这种,,,无力吐槽,,

而且就算你用了正确的加密算法,,你加密一次,两次,n 次,都是没区别的,选择一个你信任的,加密一次就够了。。加密 n 次是浪费算力。
binux
2020-08-24 13:51:15 +08:00
首先就不批评你自创加密算法的问题了

你 altchars 当成是 salt 是什么鬼?还用的是两个原本编码表里面就有的字符,那我问你
base64.b64decode('84==') 到底应该是 b'\xf3' 还是 b'\xfb'?
maemual
2020-08-24 13:58:59 +08:00
存密码,直接给你结论,用 bcrypt 吧
firejoke
2020-08-24 14:07:12 +08:00
@xuanbg #3
@cloverzrg2 #4
@long2ice #5
@CSM #6
@across #7
@hwdef #8
@maemual #10
当然不是登录密码加密
就是不想在 sqlit 里面保存明文, 为什么不用 mysql, 是因为要做的这个要在没有 mysql 的环境下跑
我还是试试 bcypt 吧
firejoke
2020-08-24 14:09:42 +08:00
@binux #9 确实是理解错了这个参数...
lewis89
2020-08-24 14:10:35 +08:00
一般都是这样的.. md5(md5(passwd)+ salt)

另外 摘要算法 编码算法 加解密算法(非对称 /对称) 要分清楚..
cloverzrg2
2020-08-24 14:12:42 +08:00
bcypt 不可逆
cloverzrg2
2020-08-24 14:13:16 +08:00
bcrypt
guanhui07
2020-08-24 14:19:28 +08:00
编码可逆,加密不可逆
wangkun025
2020-08-24 14:21:03 +08:00
楼主 ID 不错。
todd7zhang
2020-08-24 14:26:22 +08:00
altchars 啊,这个只是拿来给 url_safe_b64encode 干的啊,你当 salt 使...
shintendo
2020-08-24 14:46:11 +08:00
@guanhui07 加密是可逆的,不可逆的是摘要
muzuiget
2020-08-24 17:00:14 +08:00
base64.b64encode 第二个参数是 altchars 啊大佬。

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

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

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

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

© 2021 V2EX