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

JAVA版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版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默認不會對」/」進行編碼,因此須要對該函數進行參數指定,以下實現。json

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

關於GMT時間獲取的實現:函數

Python版ui

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);
}
相關文章
相關標籤/搜索