PHP RSA与AES之加密解密(二)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39647045/article/details/81539298

二 通用协议

通讯协议 HTTP
请求方法 POST
请求URL http://host:port/sdk
授权验证 appId: 请求头,客户端唯一标识(无需加密) requestId: 请求头,请求唯一标识(使用RSA加密)
请求数据 请求数据在HTTP请求主体中传递(使用AES加密)
加密算法 RSA 与 AES 结合 (AES/ECB/PKCS5Padding)
字符编码 Base64、UTF-8

加密算法

AES加密
1. 加密请求信息

为每个请求生成一个独立的AES SecretKey,使用AES算法,通过SecretKey加密请求数据的JSON字符串,将得到的加密数据经过Base64编码得到一个UTF-8字符串。将此结果字符串作为HTTP POST方法的请求主体(RequestBody)。

2. 解密响应结果

使用AES SecretKey解密服务端成功响应的Base64字符串,解密后得到服务端响应的JSON字符串。

RSA加密
1. 加密SecretKey

使用RSA 公钥(publicKey)加密AES SecretKey,将得到的加密数据经过Base64编码得到一个UTF-8字符串。将此结果字符串作为HTTP POST方法请求头的requestId字段值

2. 解密SecretKey

使用RSA 私钥(privateKey)加密请求头中的requestIdBase64字符串,得到AES SecretKey的原始字节数据,并重新构建成SecretKey。

请求响应流程
1. 发起请求

客户端准备请求头(appId、requestId)、请求体信息(requestBody),通过HTTP POST方法向服务端发起请求。

2. 服务端验证

服务端接收到客户端请求,首先获取appId,判断appId是否有效;如果appId无效或requestId为空,立即响应未授权信息(HttpStatus:401)。
服务端对requestId做Base64解码,通过appId对应的RSA 私钥(privateKey)解密Base64解密结果,得到AES SecretKey。
服务端读取请求体重的Base64字符串,并进行Base64解码,通过AES SecretKey解密
Base64解密结果,得到原始请求的JSON的UTF-8字符串。
在解密过程中因为requestId的不合法情况,服务端立即响应拒绝请求信息(HttpStatus:403)。

3. 服务端响应

服务端成功处理业务后,将响应结果转换成JSON的UTF-8字符串,通过AES SecretKey加密得到Base64字符串,将此字符串作为请求响应结果。

4. 响应客户端

客户端接收到服务端成功响应(HttpStatus:200),获取响应结果(加密后的Base64字符串)。经过Base64解码,通过AES SecretKey解密,将解密后的数据转换为UTF-8格式的字符串,得到服务端响应的原始JSON字符串。

请求实例

证书信息
appId:
test
publicKey:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEBflTi1uIdpSLZdpTpwjtPu+xMKi6OlzdcZqzRaR0NnCNYI1NlkNi5sMIm7CRSVymvfifFpd1Y9GHnqLmW9r4dfiHzQpn75KDnsMODNNKuHiHTNt+JFOxwmn2eJ1bJJhUaPs/vSbe+2L113nZ/PK9PnwLlzv09prJICv4LjfMwwIDAQAB
privateKey:
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMQF+VOLW4h2lItl2lOnCO0+77EwqLo6XN1xmrNFpHQ2cI1gjU2WQ2LmwwibsJFJXKa9+J8Wl3Vj0YeeouZb2vh1+IfNCmfvkoOeww4M00q4eIdM234kU7HCafZ4nVskmFRo+z+9Jt77YvXXedn88r0+fAuXO/T2mskgK/guN8zDAgMBAAECgYAWBqXRYWNTnh9q2nMB208BeYTtYA5VfqFYsJ81bang9Q0IlcTK5wuDXXKk0PmyGZAznD0Hgz5ZjnHIz2Z2g/PCrMVt+ygGNi/Ic7dOcEBUCU8lNgBQ9Rb0rDy4FAyei0moIBuX5mm5l7664B4ctKGaD/ZTnT1lpBiI1m6NkpT0AQJBAPfKc/ovQZcJs4CwizasEBHKFU20BOanF0Q2KXXQMEfUVeJwMmRIAfaNg5X/R+Y+p3vIRdbzCvlzzu9b8yGPyUMCQQDKhHlQNr1IVbAm+u+Xwq60ee8bMK/6yreVYEmTz7glNMnDLk1htq0iBinZJz+IpfJi4UIUy4aDQ7qttHyY3/aBAkEAvpXZ5FkKgsg0Z0vil5d5+KTNA+ntRxbHf3CFLReGuwinUjXnnFgCIoev6OPjgkU4fq2Igg6Hp1wakuHPPEYijwJAdxpH+nvnADac3Z/w7tDpTGz1yYjtxlIYe/pf61VbmE4eZvLBQblcw0jarcKeY/AsyChwY6h62JIppOUj7gixgQJBAIK4zPkJhiiFZYrjkHp8JXjprLbyTFL/FpwQTB4l53qXdLZXroymFZFhN3eWXMdcwGwC+vNFva1OC2bPDf2RA44=

发送请求

AES SecretKey对应的Base64字符串:
cbkV1CTPzgC7K8u1485GNg==
原始请求体JSON字符串:
{“val1”:1,”val2”:5}

请求信息

{
      Headers: {
           appId: "test",
           requestId: "KUct+A/Ukkssnz4zBXI7TG+fMIJeLGsudtbz96s3BIk5fPAFxIkbGIwNmc5UcmUXk5lJ+6jk1gT7pPiYoE7ksafKFuxO8eZF7sWII/dPkxOIfgMOC2ZEp84IoGwEYJiWkUQsnHcMNiFixQySZo7bNGre5rzTD7mjLkjMRQLqetA="
      },
      requestBody: "Bsa3B8/HtY2KGdQu6P5Itt8ZIAOzwtVA24VW21oIUaA="
}

服务端响应

原始JSON字符串:
{“code”:200,”result”:6}
客户端实际接收到的结果(Base64字符串):
h5nN/sAshI7iQ0ES5AMT+vRcEmysGBeV+WAyuw0B1lk=

展开阅读全文

没有更多推荐了,返回首页