usersig 生成算法 python 描述

由于我们的用户使用的后台的工具和平台不尽相同,而我们 api 所能适应的平台是有限的,所以在此简要描述下 usersig 的生成算法,以便在用户需要而我们又没有提供时,用户可以自己进行实现。下面是 python 描述的算法(其实直接可以用的),

  1. #! /usr/bin/python
  2. # coding:utf-8
  3.  
  4. __author__ = "tls@tencent.com"
  5. __date__ = "$Mar 3, 2016 03:00:43 PM"
  6.  
  7. import OpenSSL
  8. import base64
  9. import zlib
  10. import json
  11. import time
  12.  
  13. ecdsa_pri_key = """
  14. -----BEGIN EC PARAMETERS-----
  15. BgUrgQQACg==
  16. -----END EC PARAMETERS-----
  17. -----BEGIN EC PRIVATE KEY-----
  18. MHQCAQEEIEJDBDY4KVdj3dPBacADreB772ok45A57YWrUUvc5fMQoAcGBSuBBAAK
  19. oUQDQgAEaPVFHhWqRDnKnVlyU5JIzXOUyOJd/pPUwhLUovf+PYBm7otRBptnvJ4E
  20. oJ4qeSJNG0v4XdiqM3mtChkhUEFT3Q==
  21. -----END EC PRIVATE KEY-----
  22. """
  23.  
  24. def list_all_curves():
  25.     list = OpenSSL.crypto.get_elliptic_curves()
  26.     for element in list:
  27.         print element
  28.  
  29. def get_secp256k1():
  30.     print OpenSSL.crypto.get_elliptic_curve('secp256k1');
  31.  
  32.  
  33. def base64_encode_url(data):
  34.     base64_data = base64.b64encode(data)
  35.     base64_data = base64_data.replace('+', '*')
  36.     base64_data = base64_data.replace('/', '-')
  37.     base64_data = base64_data.replace('=', '_')
  38.     return base64_data
  39.  
  40. def base64_decode_url(base64_data):
  41.     base64_data = base64_data.replace('*', '+')
  42.     base64_data = base64_data.replace('-', '/')
  43.     base64_data = base64_data.replace('_', '=')
  44.     raw_data = base64.b64decode(base64_data)
  45.     return raw_data
  46.  
  47. class TLSSigAPI:
  48.     """"""    
  49.     __acctype = 0
  50.     __identifier = ""
  51.     __appid3rd = ""
  52.     __sdkappid = 0
  53.     __version = 20151204
  54.     __expire = 3600*24*30       # 默认一个月,需要调整请自行修改
  55.     __pri_key = ""
  56.     __pub_key = ""
  57.     _err_msg = "ok"
  58.  
  59.     def __get_pri_key(self):
  60.         return OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, self.__pri_key);
  61.  
  62.     def __init__(self, sdkappid, pri_key):
  63.         self.__sdkappid = sdkappid
  64.         self.__pri_key = pri_key
  65.  
  66.     def __create_dict(self):
  67.         m = {}
  68.         m["TLS.account_type"] = "%d" % self.__acctype
  69.         m["TLS.identifier"] = "%s" % self.__identifier
  70.         m["TLS.appid_at_3rd"] = "%s" % self.__appid3rd
  71.         m["TLS.sdk_appid"] = "%d" % self.__sdkappid
  72.         m["TLS.expire_after"] = "%d" % self.__expire
  73.         m["TLS.version"] = "%d" % self.__version
  74.         m["TLS.time"] = "%d" % time.time()
  75.         return m
  76.  
  77.     def __encode_to_fix_str(self, m):
  78.         fix_str = "TLS.appid_at_3rd:"+m["TLS.appid_at_3rd"]+"\n" \
  79.                   +"TLS.account_type:"+m["TLS.account_type"]+"\n" \
  80.                   +"TLS.identifier:"+m["TLS.identifier"]+"\n" \
  81.                   +"TLS.sdk_appid:"+m["TLS.sdk_appid"]+"\n" \
  82.                   +"TLS.time:"+m["TLS.time"]+"\n" \
  83.                   +"TLS.expire_after:"+m["TLS.expire_after"]+"\n"
  84.         return fix_str
  85.  
  86.     def tls_gen_sig(self, identifier):
  87.         self.__identifier = identifier
  88.  
  89.         m = self.__create_dict()
  90.         fix_str = self.__encode_to_fix_str(m)
  91.         pk_loaded = self.__get_pri_key()
  92.         sig_field = OpenSSL.crypto.sign(pk_loaded, fix_str, "sha256");
  93.         sig_field_base64 = base64.b64encode(sig_field)
  94.         m["TLS.sig"] = sig_field_base64
  95.         json_str = json.dumps(m)
  96.         sig_cmpressed = zlib.compress(json_str)
  97.         base64_sig = base64_encode_url(sig_cmpressed)
  98.         return base64_sig 
  99.  
  100. def main():
  101.     api = TLSSigAPI(1400001052, ecdsa_pri_key)
  102.     sig = api.tls_gen_sig("xiaojun")
  103.     print sig
  104.  
  105. if __name__ == "__main__":
  106.     main()

复制代码

下面用文字简要描述下,
1.将用户的信息组装成一个字符串(json格式的,是直接拼装的,因为顺序不能乱),是哪些信息,可以看 __encode_to_fix_str;
2.使用 sha256 将字符串 hash,然后再用私钥签名,一般加密接口都会一把搞定,加密曲线使用的是 secp256k1;
3.把第2步得到的缓冲区进行base64;
4.将所有用户的信息以及第3步得到签名写进一个 json 串,此时可以不论顺序;
5.将 json 进行序列化,再 zlib 压缩,最后 base64(替换了某些字符,具体哪些看代码),出炉。

特别注意,这段代码在 windows 上验证没问题,但是红帽系(rel 和 centos)上不支持我们使用的曲线,list_all_curves 可以打印所有支持的曲线,红帽系的没有 secp256k1。

如果发现系统所带的 openssl 扩展不支持我们选定的曲线,可以参考 http://bbs.qcloud.com/thread-23280-1-1.html
 

原文网址:http://bbs.qcloud.com/thread-14366-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值