前端base64编码的坑

作者: stois | 来源:发表于2016-11-03 17:45 被阅读839次

    故事背景:
    前后端每次通讯的时候,需要验证sign,这个sign经过了b64_md5两步骤操作。
    在python端,生成sign的代码如下:

     import md5
     import base64
     m = md5.new("32438c62a70a4d4ebfb1730b262d4bea&POST&/voip/tpsn/sendsms&{bussiness={parameters=[Tom]&phone=18688721878&template=21}&system={appkey=580419120263&charset=UTF-8&timestamp=1478081529&version=1.0.0}}")
    print m.digest()    // 这个方法出来的是二进制数据
     sign = base64.urlsafe_b64encode(m.digest())[:-2]
    print sign
    
    print m.hexdigest()  //这个方法是16进制数显示的
    

    这里先md5再经过base64, 使用了一个urlsafe_b64encode的方法。

    前端在实现以上逻辑的时候,当然会首选现成的库文件,我所找到的代码参见这里, 直接使用b64_md5这个方法皆可。

    但是这样生成的sign与python生成的sign有一些细微的区别,比如js生成的带有+号,而在python中则显示为-号。这让我想到应该调查下python中urlsafe的处理方式

    其中提到:

    由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_

    于是对b64_md5之后返回的字符串进行替换:

    var hash = b64_md5(newString);
    hash = hash.replace(/\+/g, "-");
    hash = hash.replace(/\//g, "_");
    

    即可生成与python相同的sign。

    相关文章

      网友评论

        本文标题:前端base64编码的坑

        本文链接:https://www.haomeiwen.com/subject/zoqiuttx.html