Day 3 - 安全签章: HashId 计算

图 3-1
图 3-1: 各栏位资料范例

经过前一篇文章的示范,我们使用 Postman 的测试拿到了 Nonce 值。如上图,Nonce 是我们发送给丰支付 API 的请求中,其中一个栏位而已。其它例如 Version 是固定值,ShopNo 是官方配给给我们的店家代码,SignMessage 则是另外两个我们要产生的栏位资料。

产生安全签章 Sign 的文件说明在第 17 页。

HashId 计算

图 3-2
图 3-2: 文件条目,第五章节第四段。

安全签章是由资料栏位的网址编码查询字串 (URL-encoded query string)加上 Nonce 再加上 HashId 之後,再经过 SHA256 编码产生。

图 3-3
图 3-3: 文件条目,第五章节第四段第二条。

HashId 是由永丰技术客服给我们的四组杂凑值计算而成。这四组杂凑值各有代号,分别为 A1、A2、B1、B2 如下范例:

代号 杂凑值
A1 4D9709D699CA40EE
A2 5A4FEF83140C4E9E
B1 BC74301945134CB4
B2 961F67F8FCA44AB9

计算规则

手册上是这样描述的:

图 3-4
图 3-4: API手册 - HashId 说明

使用 A1 与 A2 这一对杂凑值进行按位运算 (bitwise operation),采用「按位元或 」运算。B1 与 B2 也进行同样的运算,取得算出来的字串後,两者相加则为 HashId。

位元运算符的的说明在 PHP 官方手册这一段有详细说明,并有一个范例关於两个数值使用 XOR,如下:

<?php
echo 12 ^ 9; // Outputs '5' (int)

^ 符号为位元运算符,将 12 及 9 以「按位元或」(XOR, Exclusive-Or) 进行运算。

计算实作

使用 PHP 的朋友,永丰金技术客服已有提供 PHP 的范例函式可直接使用,或者可以使用笔者在稍候章节释出的非官方版本 SDK。

非使用 PHP 的朋友,实作上,则是将 A1 的字串 4D9709D699CA40EE 分成 4D, 96, 09, D6, 99, CA, 40, EE 八组 16 进位的 HEX 值

A2 的字串 5A4FEF83140C4E9E 分成的 5A, 4F, EF, 83, 14, 0C, 4E, 9E 八组 16 进位的 HEX 值。

B1 及 B2 也是一样。

代号 杂凑值 分组(HEX, 16 进位)
A1 4D9709D699CA40EE 4D, 97, 09, D6, 99, CA, 40, EE
A2 5A4FEF83140C4E9E 5A, 4F, EF, 83, 14, 0C, 4E, 9E
B1 BC74301945134CB4 BC, 74, 30, 19, 45, 13, 4C, B4
B2 961F67F8FCA44AB9 96, 1F, 67, F8, FC, A4, 4A, B9

接着将 HEX 转成 10 进位数字如下:

代号 杂凑值 分组(10 进位)
A1 4D9709D699CA40EE 77, 151, 9, 214, 153, 202, 64, 238
A2 5A4FEF83140C4E9E 90, 79, 239, 131, 20, 12, 78, 158
B1 BC74301945134CB4 188, 116, 48, 25, 69, 19, 76, 180
B2 961F67F8FCA44AB9 150, 31, 103, 248, 252, 164, 74, 185

可使用的 PHP 原生函式为 base_convert

图 3-5
图 3-5: base_convert 用法说明

再跑回圈去计算 A1[0] ^ A2[0]A1[1] ^ A2[1] 以此类推。

例如:

<?php
echo 77 ^ 90; // Outputs '23' (int)
echo 151 ^ 79; // Outputs '216' (int)

A1 ^ A2

- 0 1 2 3 4 5 6 7
A1 77 151 9 214 153 202 64 238
A2 90 79 239 131 20 12 78 158
A1 ^ A2 23 216 230 85 141 198 14 112

B1 ^ B2

- 0 1 2 3 4 5 6 7
B1 188 116 48 25 69 19 76 180
B2 150 31 103 248 252 164 74 185
B1 ^ B2 42 107 87 225 185 183 6 13

最後再把结果转回 HEX 字串,组合起来即可。

A 组合

- 0 1 2 3 4 5 6 7
Decimal 23 216 230 85 141 198 14 112
HEX 17 d8 e6 55 8d c6 0e 70

B 组合

- 0 1 2 3 4 5 6 7
Decimal 42 107 87 225 185 183 6 13
HEX 2a 6b 57 e1 b9 b7 06 0d

A1 与 A2 的结果字串与 B1 与 B2 的结果字串组合起来即为 HashId。

对了,别忘了把字串转为大写唷。结果:

17D8E6558DC60E702A6B57E1B9B7060D

本文更新於笔者的 TerryL 部落格,Day 3 - 安全签章: HashId 计算,有兴趣可前往阅读及讨论。


<<:  Day02:从建立环境到Hello Django

>>:  [DAY 3] Browser-server model的演进

Day 3 ARM的多样性与开发环境

一般来说,ARM组合语言,目前大部分是称作嵌入式系统,大部分会说它是写到韧体里面的程序语言,就是硬体...

计算API所需要的参数: IV

重点是要透过第一天的 Nonce 来算出 IV,果然金融机构的 API 就是复杂。要从计算的结果再计...

[DAY-10] 人才密度最大化 留任测试

理想上 一个组织只要慎用选择人才 这些精挑细选而来的员工就会永远发光发热 BUT 有时候是你用人辜...

【资料结构】读档相关 12/18更

二维阵列的一维读入法 #include <math.h> #include <st...

Day4 用python写UI-聊聊视窗控件配置管理员-grid方法

今天要介绍的是grid()方法,这个方法就像表格式排版,控件是依据指定的索引位置, 放入表格中,很适...