API加解密签名算法-技术调研

一、概述

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-SHA1HMAC-SHA256进行评估和比较。

三、评估和比较

本文对上述四个技术选项进行了综合的评估和比较,考虑了性能、安全性、易用性等多方面的因素,并总结为以下情况:

技术选项AESRSAHMAC-SHA1HMAC-SHA256
开发者美国国家标准与技术研究院Rivest、Shamir、AdlemanIETF组织IETF组织
公司使用谷歌谷歌云服务、微软、亚马逊等用于数据加密谷歌云服务用于数字签名、微软用于密钥交换和数字签名等腾讯云-签名方法v1、阿里云,用于api签名腾讯云-签名方法v3,阿里云、华为云、百度云,用于api签名
算法类型对称加密算法非对称加密算法 私钥签名、公钥验签单向散列加密算法单向散列加密算法
密钥长度128(实验)、192、2561024、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签名
劣势小数据量签名相对较慢长密钥,签名相对较慢存在安全隐患大数据量签名相对较慢
备注:在性能测试中,添加一个测试字段,对应的值分别为10w、100w、1000w级别长度的字符串,测试算法的签名速度,记录的签名耗时由多次实验后所得时间再取均值,详细实验代码见附录。

四、使用案例

腾讯云-签名算法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

附件

signature.zip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值