前端base64编码的坑

故事背景:
前后端每次通讯的时候,需要验证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。

推荐阅读更多精彩内容