附录 1. HTTP通信加密算法

当需要和 Spark 平台进行 HTTP 通信时,需要将原始的 Query String 转换为和请求时刻相关的 Hashed Query String 后再通过 GET 方法请求 Spark 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:

特别说明:
  QueryString 里面的value 值都需要进行URL Encode 之后,再进行传递,否则会Hash校验失败。
  本算法默认支持md5加密,如需sha256加密则需要添加参数crymode=sha256;

1. 对于q中的每个键值对按照键的字母顺序升序排序,得到排序后的请求字符串qs;

2.  加入当前时间的Unix 时间戳和Spark 平台帐号对应的API Key 值,得到散列前的字符串qf:

      qf ← qs&time=12345&salt=aSdF1234

3. 根据所选择的加密算法计算得到qf 的hash 值,假设为abcdefg
         hash ←md5(qf)或sha256(qf)

4. 最终的HashedQueryString 为:

      hqs ← qs&time=12345&hash=abcdefg

 用hqs 代替q 进行Http 通信。

下面分别给出md5和sha256两种加密方式的例子说明计算过程。假设用户从 Spark 获取到的 API Key 值是 aSdF1234, 当前时间为2010年12月9日15点23分12秒,原始的QueryString 是name=harry&level=top&salary=1000

  md5加密:

    第一步,将上述 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


    sha256加密:

    第一步,添加crymode=sha256参数到QueryString中,然后将按照字母顺序进行升序排序,结果是

    crymode=sha256&level=top&name=harry&salary=1000

    第二步,附加 time 值和 salt 值,得到取 hash 前的字符串

    crymode=sha256&level=top&name=harry&salary=1000&time=1291879392&salt=aSdF1234

    第三步,对上述字符串取 sha256 值

    hash=C262758C8F9DACFFFC335041017178A9F944682F59CC4237932881C20F4699AF

    因此,最终进行 Http 通信的字符串为

  crymode=sha256&level=top&name=harry&salary=1000&time=1291879392&hash=
C262758C8F9DACFFFC335041017178A9F944682F59CC4237932881C20F4699AF

results matching ""

    No results matching ""