数字签名介绍

  • 数字签名技术常用于系统与系统之间数据通讯时,防止原始信息被篡改的一种安全手段,并不是对数据进行加解密。
  • 数字签名通常是对原始的信息产生一段信息摘要 (一般而言信息摘要不可逆),通讯双方比对信息摘要,以防止原始信息被篡改。

常用的数字签名方式有很多种,SKY平台目前支持的签名算法有MD5、SHA1、SHA256、SHA1withRSA、SHA256withRSA这几种,本文将针对这几种方式进行详细的说明。

常用概念简单介绍

对称签名与非对称签名:

  • 对称签名方式通常是说签验双方采用的算法密钥相同;
  • 非对称签名方式通常是签验双方使用不同的密钥进行签名与验签。

从安全性来考虑,非对称签名方式更加安全。

公钥和私钥:

  • 公钥私钥主要是在非对称加密(签名)中使用;
  • 用于签名中,使用私钥签名,公钥来验签;
  • 用于加密中,使用公钥加密,私钥来解密。

散列算法:

  • 散列算法可以把任意尺寸的原始数据转变为一个固定尺寸的小数据,又叫散列值摘要
  • SKY助手所支持的MD5、SHA1、SHA256这几种算法,均属于散列算法。

RSA算法:

  • RSA加密算法是一种非对称加密算法,是目前最有影响力的公钥密码算法,并且被普遍认为是目前最优秀的公钥方案之一;
  • RSA能同时用于加密数字签名的算法,已被ISO推荐为公钥数据加密标准。
  • SKY助手所支持的SHA1withRSA、SHA256withRSA算法,是使用RSA算法进行加密,用SHA算法进行签名。

算法优劣及功能对比:

安全级别 运算速度 签验密钥
MD5 非常低 非常快 对称型
SHA1 较低 较快 对称型
SHA256 一般 对称型
SHA1withRSA 非对称
SHA256withRSA 非常高 较慢 非对称

备注:上述对比说明仅供参考,实际情况还需要看服务器及网络配置所定。

SKY如何签名

接下来我们将举例说明SKY助手与开发者系统对接时,双方如何进行签名与验签。

对称签名

当开发者选择MD5、SHA1、SHA256这几种算法时,采用对称签名,签名生成的通用步骤如下:

第一步:

将所有接口文档中标记需要参与签名的字段数据为集合L,将集合L内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即name1=value1&name2=value2&name3=value3…)拼接成字符串strA。
注意如下:

  • 字段名区分大小写,且按照ASCII码从小到大排序(字典序);
  • 必须是接口中标记参与签名的字段;
  • 如果参数的值为空不参与签名;
  • 传送的sign参数不参与签名,将生成的签名与该sign值作校验。
第二步:

在strA最后拼接上签名密钥key得到strB字符串,并对strB进行散列运算(根据开发者选择的具体哪种算法,如MD5),再将得到的字符串所有字符转换为小写,即得到最终的签名mySign值

签名密钥key是在模块配置中由开发者自己填写的。

举个例子(以登录回跳为例):

假设传送的参数如下:

uuid:2c098373c3574df48d242647284683d9
userid:AT200510231100017446
username:test01
phone:
email:
nickname:
loginid:test01
aparam:
uparam:bbb
nparam:
stype:web
modid:4471709652e6413c9485b3a5a7f57fed
sign:d43c6e2fafd4a4422da7c58ce0180224
执行第一步:

上述的参数phone,email,nickname,aparam,nparam都为空,因此不参与签名。
上述的参数sign不参与签名。
对参数按照name=value的格式,并按照参数名ASCII字典序排序如下:

loginid=test01&modid=4471709652e6413c9485b3a5a7f57fed&stype=web&uparam=bbb&userid=AT200510231100017446&username=test01&uuid=2c098373c3574df48d242647284683d9
执行第二步:

拼接签名密钥,假设填写的签名密钥为n3vy13wj6oaymim1lsvgjq9nja0qcund

strB = strA + "&key=n3vy13wj6oaymim1lsvgjq9nja0qcund"

strB的其结果为

loginid=test01&modid=4471709652e6413c9485b3a5a7f57fed&stype=web&uparam=bbb&userid=AT200510231100017446&username=test01&uuid=2c098373c3574df48d242647284683d9&key=n3vy13wj6oaymim1lsvgjq9nja0qcund

然后对strB进行散列运算(假设开发者选择的算法为MD5)并转换为小写

mySign = MD5(strB).toLowerCase()

最终签名的mySign值为

d43c6e2fafd4a4422da7c58ce0180224
开发者验签
  • 经过上述处理后,开发者则可以将自己计算出来的mySign与传送参数中的sign进行比较,如果一致则表示验签通过。
  • 本例中,mySign和sign的值都为d43c6e2fafd4a4422da7c58ce0180224,因此可以表示验签通过。

非对称签名

当开发者选择SHA1withRSA、SHA256withRSA这几种算法时,采用非对称签名,签名生成的通用步骤如下:
密钥长度:2048 bit
未完待续。。。

文档更新时间: 2020-06-11 04:59   作者:彭湃