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