THQS相关

更新时间:2022-12-28

说明

当需要和云课堂系统进行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 ""