1. 程式人生 > >JAVA和Python HmacSHA1 演算法計算API簽名的實現

JAVA和Python HmacSHA1 演算法計算API簽名的實現

JAVA版
// 計算簽名
private static final String ENCODING = "UTF-8";
private static final String ALGORITHM = "HmacSHA1";
Mac mac = Mac.getInstance(ALGORITHM);
String text = "你需要計算的內容";
String acKey = "一般為你的介面accesskey";
mac.init(new SecretKeySpec(acKey.getBytes(ENCODING), ALGORITHM));
byte[] signData = mac.doFinal(text.getBytes(ENCODING));
String signature = new
String(Base64.encodeBase64(signData));
Python版
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import requests
import json 
import traceback
import urllib
import hashlib
import time
import uuid
import string
import datetime
from hashlib import sha1
import base64
import
hmac from hmac import new as hmac #授權 def hash_hmac(ac_key, text): return str(hmac(ac_key, text, sha1).digest().encode('base64')[:-1])

關於API引數URL編碼需要注意的問題:
JAVA的URLEncoder.encode函式預設對”/”進行編碼,而python的URL編碼函式urllib.quote預設不會對”/”進行編碼,所以需要對該函式進行引數指定,如下實現。

urllib.quote("/",safe='')

關於GMT時間獲取的實現:

Python版
time_format_str = datetime.datetime.utcnow().isoformat()
time_format_str = time_format_str.split(".")[0]+"Z"
JAVA版
private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static String formatIso8601Date(Date date) {
SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
df.setTimeZone(TimeZone.getTimeZone("GMT"));
return df.format(date);
}