数字签名介绍
- 数字签名技术常用于系统与系统之间数据通讯时,防止原始信息被篡改的一种安全手段,并不是对数据进行加解密。
- 数字签名通常是对原始的信息产生一段信息摘要 (一般而言信息摘要不可逆),通讯双方比对信息摘要,以防止原始信息被篡改。
常用的数字签名方式有很多种,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
未完待续。。。