一、概述
1、背景
接口请求参数采用明文的方式进行传输,存在被窃听、篡改或伪造请求的风险,无法保证参数在传输过程中的机密性和完整性。
2、目标
通过评估各种加解密和签名算法的性能、安全性、易用性等,寻找一种适用于谷神平台API加解密签名的算法,以确保数据的机密性、完整性和身份验证。
二、技术选项
目前主流的加密算法可以分为三大类:对称加密算法、非对称加密算法、单向散列加密算法。
对称加密算法使用相同的密钥进行加密和解密操作,加密和解密速度快,但密钥管理相对复杂,常见的对称加密算法包括DES、3DES、AES。DES采用64位密钥对数据进行加密和解密操作,由于密钥长度较短,存在被暴力碰撞破解的风险,现在已经不安全了。3DES是在DES的基础上发展而来,使用3个不同的密钥进行加密,安全性得到提高,但加密和解密的过程比较慢。 AES是目前最广泛应用的对称加密算法之一,其密钥长度可以是128位、192位或256位,比DES和3DES更安全可靠,而且加密解密速度较快,被广泛应用于各种领域的数据加密保护中。
非对称加密算法使用两个不同的密钥进行加密和解密操作,这两个密钥是一对的,称为公钥和私钥。公钥可以向他人公开,用于数据的加密,只有对应的私钥才能对数据进行解密,加密和解密速度比对称加密算法慢得多。常见的非对称加密算法包括RSA、ECC、DSA。RSA是最常见和应用最广泛的非对称加密算法,基于大数因子分解的数学难题,使用公钥加密、私钥解密的方式进行加密和解密操作。ECC是一种基于椭圆曲线数学问题的非对称加密算法,相比于RSA,ECC提供了相同安全性下更短的密钥长度,从而提高性能和效率,但ECC算法在国内受专利保护,可能会引起法律纠纷,不建议使用。DSA是一种用于数字签名的非对称加密算法,主要用于验证数据的完整性和认证数据的发送方。
单向散列加密算法,也称为哈希函数,是一种将任意长度的数据转换为固定长度的散列值的算法,并且加密过程是不可逆的,即无法从散列值还原出原始数据。常见的单向散列加密算法包括MD5、SHA、HMAC。MD5是一种广泛使用的散列算法,但存在碰撞漏洞,即不同的输入可能会生成相同的散列值,因此在安全性要求较高的场景中,不建议使用MD5进行密码存储或数据完整性验证。SHA是一系列散列算法的家族,其中SHA-1、SHA-256、SHA-512等最为常见,SHA-1已被认为不安全,推荐使用更强的SHA-256或SHA-512,SHA算法常用于密码存储、数字签名、数据完整性校验等安全性要求较高的场景。HMAC结合了散列函数和密钥,用于生成消息的身份验证和完整性验证,通过密钥的引入增强了安全性,确保只有持有正确密钥的人才能验证消息的真实性和完整性,常见的HMAC算法包括HMAC-MD5、HMAC-SHA1、HMAC-SHA256等,它们分别基于MD5、SHA-1和SHA-256散列算法。
综上所述,本文将选择对称加密算法AES、非对称加密算法RSA以及单向散列加密算法HMAC-SHA1和HMAC-SHA256进行评估和比较。
三、评估和比较
本文对上述四个技术选项进行了综合的评估和比较,考虑了性能、安全性、易用性等多方面的因素,并总结为以下情况:
技术选项 | AES | RSA | HMAC-SHA1 | HMAC-SHA256 |
---|---|---|---|---|
开发者 | 美国国家标准与技术研究院 | Rivest、Shamir、Adleman | IETF组织 | IETF组织 |
公司使用 | 谷歌谷歌云服务、微软、亚马逊等用于数据加密 | 谷歌云服务用于数字签名、微软用于密钥交换和数字签名等 | 腾讯云-签名方法v1、阿里云,用于api签名 | 腾讯云-签名方法v3,阿里云、华为云、百度云,用于api签名 |
算法类型 | 对称加密算法 | 非对称加密算法 私钥签名、公钥验签 | 单向散列加密算法 | 单向散列加密算法 |
密钥长度 | 128(实验)、192、256 | 1024、2048(实验)、4096 | 任意长度、160(实验) | 任意长度、160(实验) |
性能 | 签名耗时: 7ms(10w) 16ms(100w) 43ms(1000w) 大数据量有性能优势 | 签名耗时: 验签耗时: 8ms(10w) 2ms(10w) 22ms(100w) 6ms(100w) 95ms(1000w) 51ms(1000w) 签名性能比验签性能差得多 | 签名耗时: 2ms(10w) 5ms(100w) 50ms(1000w) 小数据量有性能优势 | 签名耗时: 2ms(10w) 7ms(100w) 75ms(1000w) 小数据量有性能优势 |
安全性 | 安全性较强,被广泛认可 | 安全性较强,被广泛认可 | SHA1存在安全性问题,碰撞攻击抵抗性相对较弱 | SHA256更加安全,碰撞攻击抵抗性更强 |
易用性 | 后端:javax.crypto.Cipher封装了该算法;前端:Web Crypto API封装了该算法,使用简单 | 后端:java.security.Signature封装了该算法;前端:CryptoJS库封装了该算法,使用简单 | 后端:javax.crypto.Mac封装了该算法;前端:CryptoJS库封装了该算法,使用简单 | 后端:javax.crypto.Mac封装了该算法;前端:CryptoJS 库封装了该算法,使用简单 |
优势 | 安全性高,大数据量签名相对较快 | 安全性高 | 小数据量签名较快 | 安全性高,小数据量签名较快,广泛应用于api签名 |
劣势 | 小数据量签名相对较慢 | 长密钥,签名相对较慢 | 存在安全隐患 | 大数据量签名相对较慢 |
四、使用案例
腾讯云-签名算法v3
1、时序图
相关参数解释
Nonce : 每个请求随机生成一个nonce,服务端可以考虑用redis记录该nonce,如果出现相同的nonce,说明该请求是重放过的,每个nonce设置一个过期时间,时间过后自动清理,但nonce过期后,仍存在被重放攻击的风险。
Timestamp : 每个请求设置一个时间戳,自定义时间(比如1分钟),服务器只接受当前时间与请求时间相差1分钟内的请求,视大于1分钟的请求为过期请求。此时,可以设置redis的缓存时间略大于1分钟,就可以解决重放攻击。
备注:腾讯云-签名方法v1中使用了nonce参数,而v3已经不使用了,官方文档没有给出说明,可能是系统进行了其他幂等性升级,无需在此考虑重放攻击的风险,但是为了便于理解,时序图中仍给出nonce参数的使用。
2、签名步骤
step1:拼接规范请求串
按如下伪代码格式拼接规范请求串(CanonicalRequest):
CanonicalRequest =
HTTPRequestMethod + '\n' +
CanonicalURI + '\n' +
CanonicalQueryString + '\n' +
CanonicalHeaders + '\n' +
SignedHeaders + '\n' +
HashedRequestPayload
step2:拼接待签名字符串
StringToSign =
Algorithm + \n +
RequestTimestamp + \n +
CredentialScope + \n +
HashedCanonicalRequest
step3:计算签名
1)计算派生签名密钥,伪代码如下:
SecretKey = "Gu5t9xGARNpq86cd98joQYCN3*******"
SecretDate = HMAC_SHA256("TC3" + SecretKey, Date)
SecretService = HMAC_SHA256(SecretDate, Service)
SecretSigning = HMAC_SHA256(SecretService, "tc3_request")
2)计算签名,伪代码如下:
Signature = HexEncode(HMAC_SHA256(SecretSigning, StringToSign))
step4:拼接 Authorization
按如下格式拼接 Authorization:
Authorization =
Algorithm + ' ' +
'Credential=' + SecretId + '/' + CredentialScope + ', ' +
'SignedHeaders=' + SignedHeaders + ', ' +
'Signature=' + Signature
计算签名结束后,将Authorization和Timestamp参数都放在Header请求头部中。
五、结论和建议
基于以上评估结果和分析,本文建议在API加解密签名中采用HMAC-SHA256算法。它在安全性、性能和社区支持方面表现优秀,并且易于集成和使用。
参考资料
1、腾讯云:https://cloud.tencent.com/document/product/213/15693#Java
2、阿里云:https://help.aliyun.com/zh/api-gateway/user-guide/use-digest-authentication-to-call-an-api
3、华为云:https://support.huaweicloud.com/devg-apisign/api-sign-algorithm-004.html
4、百度云:https://cloud.baidu.com/doc/Reference/s/Njwvz1wot
5、亚马逊:https://docs.aws.amazon.com/elemental-live/latest/ug/drm-support-solutions.html
6、谷歌云服务:https://cloud.google.com/docs/security/encryption/default-encryption?hl=zh-cn
7、微软:https://learn.microsoft.com/zh-cn/azure/media-services/latest/drm-encrypt-text-how-to