网络数据的传输一般都是用对称加密算法
非对称加密算法因为效率的问题只用来加密 对称加密算法 的秘钥和 用于 数字签名
Android的RSA公钥-->发送给服务器用
服务器的RSA公钥-->发送给客户端用
如客户端验证服务器的真实性
Android客户端(拥有AES秘钥)
使用 非对称加密算法即 服务器的RSA公钥 对 Android客户端的AES的秘钥 进行加密
然后 Http Get请求 并发送 Android客户端的AES秘钥 给服务器
服务器收到请求后,使用 自己的RSA私钥 对请求解密 获取到 Android的AES秘钥 ,然后把发送给Android客户端的数据如 byte [] datas进行签名即sign
把sign和datas 一起用 Android客户端的AES秘钥 进行加密,然后发送给Android客户端
Android客户端收到后,再用 自己的AES秘钥 把整个数据包解密,此时进行数据分离,获取到sign和datas,然后对sign进行验证,验证方法就是用 服务器的公钥 配合参数sign进行签名验证
服务器的RSA私钥 进行签名 sign,因为sign的长度是固定的(和初始化的秘钥长度相等),故很容易进行数据分离
如解密后进行str.substring()可以分离 datas和sign
文章来源
1、PC/M端授权登陆,采用协议类似于oauth2协议
2、 App端授权登陆,提供两种后端验证方式
详细配置 参考该文档,手把手教学
https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple
后台配置 请参考下方文档,其中client_id对应的是Services ID,redirect_uri就是后台配置的接收code码的地址
https://appleid.apple.com/auth/authorize?response_type=code&client_id=&redirect_uri=&state=1234
可以参考如下 文档 ,重点讲解苹果授权登陆后端如何验证
https://www.jianshu.com/p/23b46dea2076
针对后端验证苹果提供了两种验证方式,一种是基于JWT的算法验证,另外一种是基于授权码的验证
1、基于JWT的算法验证
kid,为密钥id标识,签名算法采用的是RS256(RSA 256 + SHA 256),kty常量标识使用RSA签名算法,其公钥参数为n和e,其值采用了BASE64编码,使用时需要先解码
identityToken参考样例:
其中 iss标识是苹果签发的,aud是接收者的APP ID,该token的有效期是10分钟,sub就是用户的唯一标识
首先需要了解如何构建client_secret,详细文档可以参考如下两个:
https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple
https://developer.apple.com/documentation/signinwithapplerestapi/generate_and_validate_tokens
其中id_token是一个JWT,其中claims中的sub就是授权的用户唯一标识,该token也可以使用上述的验证方法进行有效性验证,另外授权code是有时效性的,且使用一次即失效
1.获取$_GET中key为不为sign、sign_type并且value不为空的项本文来自http://leo108.com2.将新生成的数组按照key的ascii值进行排序(使用ksort函数)本文来自leo108's blog3.把数组所有元素,按照“key=value”的模式用“&”字符拼接成字符串 http://leo108.com/pid-1921.asp4.把这个字符串和支付宝的安全验证码(配置中的“key”这一项)拼接,并计算md5未经允许严禁转载5.将计算出的md5值与$_GET['sign']比较,如果相同则Sign验证通过未经允许严禁转载也就是说,Sign验证失败的原因就在于$_GET数组拼接成字符串过程采集者烂JJ于是找了条同步返回的日志,因为是GET方式返回的,所以所有参数都有记录,通过上述方式计算md5,结果发现和支付宝服务器返回的md5是一致的,大概就可以猜出是Thinkphp对$_GET数组的改造导致的ThinkPHP在代码中将$_GET数组输出,发现多了一项_URL_,这是使用Thinkphp的pathinfo模式导致,可以通过$_GET['_URL_']来获取url信息。本文来自http://leo108.com而支付宝服务器异步返回却没有这个问题,是因为异步返回使用的是POST方式,验证的也是$_POST数组,Thinkphp对$_GET的改造不影响到Sign验证。ThinkPHP所以解决方案是在进行Sign验证之前将$_GET中的_URL_删除,unset($_GET['_URL_'])Thinkphp中使用支付宝接口同步返回Sign验证失败原因分析欢迎分享,转载请注明来源:夏雨云
评论列表(0条)