V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhou1996
V2EX  ›  问与答

base64 编码的问题

  •  
  •   zhou1996 · 2019-07-18 10:06:34 +08:00 · 2875 次点击
    这是一个创建于 1990 天前的主题,其中的信息可能已经有所发展或是发生改变。

    客户端对一个字符串利用 RSA 算法做数字签名,并将签完名后的字符串用 base64 编码,将编码后的字符串发给服务器,服务器 base64 解码后验证签名失败,但是在客户端能够使用签完名后字符串来验证,只要转换为 base64 就验证失败,求大神....

    21 条回复    2019-07-19 06:22:31 +08:00
    HarryQu
        1
    HarryQu  
       2019-07-18 10:13:02 +08:00
    1. 可能一端使用了 url_safe base64,另一端使用了普通的 base64,排查下编码问题。
    2. 不使用 base64 编码,直接发送数字签名,排查下签名问题。
    luckyrayyy
        2
    luckyrayyy  
       2019-07-18 10:19:49 +08:00
    base64 好像有几种标准,其中一种是在中间每隔 76 字符添加回车换行符。
    如果编码和解码实现不一致,或者系统不一致,就有可能出现错误。
    Vegetable
        3
    Vegetable  
       2019-07-18 10:20:55 +08:00
    这个大概率是你两边算法不统一造成的,客户端自己签自己验当然没问题。#1 提到的也是需要考虑的
    zhou1996
        4
    zhou1996  
    OP
       2019-07-18 10:27:17 +08:00
    @HarryQu 我在客户端,不进行 base64 编码是可以验证签名的,如果用 base64 编码,再利用 base64 解码,使用解码后的字符串来验证签名,也通不过,这都是在一端完成。大神知道原因吗
    HarryQu
        5
    HarryQu  
       2019-07-18 10:48:54 +08:00
    你是做 Android 的吗 ? 你所使用 Base64 的类是官方自带的,还是从第三方 copy 过来的 ?
    zhou1996
        6
    zhou1996  
    OP
       2019-07-18 11:27:09 +08:00
    @HarryQu 不是啊,是用 c 语言写的,base64 这个方法是从 GitHub 上面找的一个小项目。
    rrfeng
        7
    rrfeng  
       2019-07-18 11:34:59 +08:00
    你对比下两个字符串不久看到是哪里不一样了???
    ccpp132
        8
    ccpp132  
       2019-07-18 11:35:22 +08:00
    你先看 base64 编码后再解码是不是内容不变,如果做不到这一点说明你用的库有问题
    zhou1996
        9
    zhou1996  
    OP
       2019-07-18 11:41:23 +08:00
    @ccpp132 是内容不变 啊,我用比较函数,两者都是一样的
    mengzhuo
        10
    mengzhuo  
       2019-07-18 11:48:55 +08:00 via iPhone
    不用 base64 用 hex 能搞定很多问题
    ccpp132
        11
    ccpp132  
       2019-07-18 12:16:33 +08:00
    @zhou1996 那只能是你可能哪里用错了把
    iyaozhen
        12
    iyaozhen  
       2019-07-18 12:42:49 +08:00 via Android
    @HarryQu 很可能是一楼的情况,还有补=,不补的。
    0TSH60F7J2rVkg8t
        13
    0TSH60F7J2rVkg8t  
       2019-07-18 12:49:30 +08:00
    1. 把你原始数据 hash 一下,得到 hash1 值。2. 你在本地 base64 encoding 后再 decoding,把 decoding 出来的数据再 hash 一下,得到 hash2。比较 hash1 和 hash2 数据,看看是不是一样的,如果不一样,说明你的 base64 代码是错的。
    MonoLogueChi
        14
    MonoLogueChi  
       2019-07-18 12:49:34 +08:00 via Android
    那可能是你用错了吧,编码再解码之后内容一样,就说明不是 base64 编码的问题
    zhou1996
        16
    zhou1996  
    OP
       2019-07-18 15:15:25 +08:00
    @ahhui 按你的方法做了,两个 hash 出来的结果是一样的
    zhou1996
        17
    zhou1996  
    OP
       2019-07-18 15:39:03 +08:00
    @mengzhuo 有代码吗,老哥
    0TSH60F7J2rVkg8t
        18
    0TSH60F7J2rVkg8t  
       2019-07-18 15:45:56 +08:00
    @zhou1996 一样的说明 base64 加密解密都是对的。那么你是不是在用 json 传输 base64 ?考虑下 base64 里可能有字符对 json 支持不好(比如 / 和 \ ),可能你需要考虑组合 json 的时候多一步处理。可以考虑使用 base32 编码。
    mengzhuo
        19
    mengzhuo  
       2019-07-18 16:25:46 +08:00 via iPhone
    @zhou1996 字节流转十六进制还要代码么....
    shm7
        20
    shm7  
       2019-07-18 19:01:42 +08:00 via iPhone
    先判断 base64 两端是不是一样的吧?没有证据说这就是 base64 的锅
    wd
        21
    wd  
       2019-07-19 06:22:31 +08:00 via iPhone
    你两端是不是不同的程序语言?你看看加解密的 pedding 之类的设定吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1148 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:25 · PVG 02:25 · LAX 10:25 · JFK 13:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.