签名代码示例 / Sign code Example
Java
Map map = new TreeMap();
data = JSON.toJSONString(map);
/**
* HmacSHA1签名
*
* @param data 请求报文 自然排序 json 序列化
* @param secretKey 企业对应的secret
* @return
*/
public static String generateSign(String data, String secretKey) {
try {
SecretKeySpec sk = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(sk);
byte[] res = mac.doFinal(data.getBytes("UTF-8"));
Base64.Encoder encoder = Base64.getEncoder();
return encoder.encodeToString(res);
} catch (Exception e) {
logger.error("sign fail", e);
return "";
}
}
Python
import base64
import hmac
from hashlib import sha1
import json
def hash_hmac_sign(code, key, sha1):
hmac_code = hmac.new(key.encode(), code.encode(), sha1).digest()
return base64.b64encode(hmac_code).decode()
if __name__ == '__main__':
strb = {
"version": "2.0",
"access_code": "P000270",
"timestamp": "1643251754",
"device_id": "89852022018041800193",
}
strb2 = str(strb)
key_P000270 = "cfIAKh8O5ARL6HKAyUWUDYIZ64oZBJdW"
'''
data = json.dumps(strb, sort_keys=True, indent=4, separators=(',', ': ')) #indent=4 展示的样式
sort_keys是告诉编码器按照字典key排序(a到z)输出
indent参数根据数据格式缩进显示,读起来更加清晰, indent的值,代表缩进空格式
separators参数的作用是去掉‘,’ ‘:’后面的空格,在传输数据的过程中,越精简越好,冗余的东西全部去掉。
skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非string对象当作key的处理.
ensure_ascii=False (False输出中文、True输出ascii编码),json.dumps 序列化时对中文默认使用的ascii编码
'''
data = json.dumps(strb, sort_keys=True, separators=(',', ':'), ensure_ascii=False)
print(data)
print(hash_hmac_sign(data, key_P000270, sha1))
修改于 2022-10-10 03:07:31