THQS相关

说明

当需要和 Live API系统进行 HTTP 通信时,需要将原始的 Query String 转换为和请求时刻相关的 Hashed Query String 后再通过 GET 方法请求 Live API。为了描述的方便,我们将 Query String 转换为 Hashed Query String 的算法称为 THQS 算法。在描述详细的算法流程之前,我们先介绍一下 Unix 时间戳的概念。

Unix 时间戳,即该时间到 1970 年 1 月 1 日(UTC/GMT 的午夜)之间的秒数。 例如,北京时间 2010 年 12 月 9 日 15 点 23 分 12 秒的 Unix 时间戳为 1291879392。

THQS 算法

假设原来的 QueryString 为 q, 通过以下 4 个步骤,即可得到最终用于通信的 HashedQueryString:

1. 对于q中的每个键值对按照键的字母顺序升序排序,得到排序后的请求字符串qs;
2. 加入当前时间的 Unix 时间戳和直播平台帐号对应的 API Key 值,得到散列前的字符串 qf:
 qf ← qs&time=12345&salt=aSdF1234
3. 计算得到 qf 的 md5 值,假设为 abcdefg
 hash ← md5(qf)
4. 最终的 HashedQueryString 为:
 hqs ← qs&time=12345&hash=abcdefg
用 hqs 代替 q 进行 Http 通信。
下⾯举一个例⼦子说明计算过程。假设用户从直播平台获取到的API Key值是aSdF1234,当前时间为2010年12月9日15点23分12秒,原始的QueryString 是:
name=harry&level=top&salary=1000

第⼀步,将上述QueryString 按照字⺟顺序进行升序排序,结果是:
level=top&name=harry&salary=1000

第⼆步,附加time值和salt值,得到取hash前的字符串
level=top&name=harry&salary=1000&time=1291879392&salt=aSdF1234

第三步,对上述字符串取 md5 值
hash=BF04A55B30CFF562F7ADD9F054AB7FFB!

因此,最终进⾏行Http通信的字符串为level=top&name=harry&salary=1000&time=1291879392&hash=BF04A55B30CFF562F7ADD9F054AB7FFB
使用java代码编写如下:

/**
 * 功能:将一个Map按照Key字母升序构成一个QueryString. 并且加入时间混淆的hash串
 * @param queryMap  query内容
 * @param time  加密时候,为当前时间;解密时,为从querystring得到的时间;
 * @param salt   加密salt
 * @return
 */

public static String createHashedQueryString(Map<String, String> queryMap,long time, String salt) {

    Map<String, String> map = new TreeMap<String, String>(queryMap);
    String qs = createQueryString(map); //生成queryString方法可自己编写
    if (qs == null) {
        return null;
    }

    time = time / 1000;
    String hash = Md5Encrypt.md5(String.format("%s&time=%d&salt=%s", qs, time, salt));
    hash = hash.toUpperCase();
    String thqs = String.format("%s&time=%d&hash=%s", qs, time, hash);

    return thqs;
}

使用python语言编写如下:

class thqs(object):

'生成thqs请求url'

def my_urlencode(self, q):

    '对请求的字段进行urlencode,返回值是包含所有字段的list'

    l = []

    #遍历字典,进行quote_plus操作,并把所有字段拼成list

    for k in q:

        k = urllib.quote_plus(str(k))

        v = urllib.quote_plus(str(q[k]))

        url_param = '%s=%s' % (k, v)

        l.append(url_param)

    l.sort()

    return '&'.join(l)

def get_thqs(self, q):

    ‘按照thqs算法对所有的字段进行处理'

    qftime = 'time=%d' % int(time.time())

    salt = 'salt=%s' % API_KEY

    qftail = '&%s&%s' % (qftime, salt)



    qs = self.my_urlencode(q)

    qf = qs + qftail

    hashqf = 'hash=%s' % (hashlib.new('md5', qf).hexdigest().upper())

    thqs = '&'.join((qs, qftime, hashqf))

    return thqs

results matching ""

    No results matching ""