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 · 4625 次点击
    这是一个创建于 1581 天前的主题,其中的信息可能已经有所发展或是发生改变。

    直接贴测试代码

    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   ·   实用小工具   ·   1088 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:30 · PVG 07:30 · LAX 15:30 · JFK 18:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.