vnsc5858威尼斯城官网 > vnsc5858威尼斯城官网 > 支付宝异步回调验证签名的那些走过的坑,iOS如

原标题:支付宝异步回调验证签名的那些走过的坑,iOS如

浏览次数:92 时间:2019-09-16

今天做支付宝接口回调这块,不得不说,弄的我焦头烂额,翻了很多陈年旧帖,试了无数种解决坑的方案,在我成功解决的一瞬间,觉得非常有必要记录一下这些坑。

前言

有时需要在本地存储资源,并且从服务器下载资源,因为涉及到运行期间的安全性,有必要添加校验的逻辑,因此有了本文的一些思考。

签名验证错误的检查顺序(这里是基于使用官方给的demo,自己封装的请绕道):

ipa包被篡改的情况

首先思考的是ipa包的安全性问题。通过iTunes,我们可以下载ipa并且解压,修改包中的文件,再压缩成ipa包。

  • 1、如果开发者A拿到应用P的ipa包,修改其中的任何文件,都会导致签名失效,ipa包无法安装。(签名存放在.app文件的_CodeSignature文件夹)
  • 2、如果开发者B拿到应用P的ipa包,安装到自己手机中,再直接修改Bundle/Application 下的配置文件,此时应用P仍旧可以运行。
  • 3、如果开发者C拿到应用P的ipa包,修改其中的某些配置文件,用自己的证书重签名并通过其他渠道发布出去,ipa包可以正常安装。

应用在正常使用过程中,app包的文件是无法修改的,只有越狱的机子才会出现情况2;情况3中重签名的ipa包无法上传AppStore。真机app安装目录是 var/mobile/Containers/Bundle/Application沙盒目录是 var/mobile/Containers/Data/Application类似的,模拟的安装目录同样在/Bundle下,沙盒在/Data下;

图片 1

下载的资源存在沙盒目录,在未越狱的情况下,开发者并不能修改其中的文件。但是,下载资源通常使用http进行资源下载,http通过使用代理,可以很方便的修改下载的资源。为了保证下载资源的可靠性,采用了一套基于RSA算法的验证方案,具体的要点有:1、开发者产生一对密钥:公钥和私钥,私钥保存在配置平台,公钥放到客户端。2、当文件上传到配置平台后,配置平台对文件进摘要得到md5str,并私钥对md5str进行签名得到signStr,然后把 文件和signStr下发给客户端。3、客户端下载文件和signStr,计算文件的摘要得到md5str,用md5str和公钥验证signStr的有效性。

解释:非对称加密算法的计算比较复杂 ,所以只对摘要进行加密;具体的流程图如下:

图片 2

RSA算法的两种加密方式:

  • 公钥加密,私钥解密。(一般用于公钥持有方向私钥持有者
  • 私钥加密,公钥解密。(一般用于签名和验证,私钥加密相当于签名,公钥解密相当于验证)

苹果提供的Security.framework,有以下四个方法:

  • SecKeyEncrypt—encrypts a block of data using the specified key.(使用公钥对数据进行加密)
  • SecKeyDecrypt—decrypts a block of data using the specified key. (使用私钥对数据进行解密)
  • SecKeyRawSign—signs a block of data using the specified key.(使用私钥对数据签名)
  • SecKeyRawVerify—verifies a signature against a block of data and a specified key. (使用公钥对数字签名进行验证)

类比到OpenSSL,其提供了以下四个接口:

int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,int padding);int RSA_private_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,int padding);int RSA_public_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,int padding);int RSA_private_decrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,int padding);

因为RSA算法的计算量较大,一般不会直接使用RSA对数据进行加密,而是对AES的密匙进行加密,再用AES对数据加密。RSA算法原理 ,这里有一篇详细介绍RSA算法原理的文章。

拿到后台下发的签名后,就需要保存签名,可以选择:保存在文件中、保存到NSUserDefault、保存到数据库等。除此之外,是否可以保存在文件属性?写了一段代码进行测试:

 NSMutableDictionary *changedAttrDict = [[NSMutableDictionary alloc] init]; [changedAttrDict setObject:@"loying" forKey:NSFileOwnerAccountName]; [changedAttrDict setObject:@"NSFileGroupOwnerAccountName" forKey:NSFileGroupOwnerAccountName]; [changedAttrDict setObject:[NSDate dateWithTimeIntervalSinceNow:3600] forKey:NSFileCreationDate]; NSError *error; BOOL ret = [[NSFileManager defaultManager] setAttributes:changedAttrDict ofItemAtPath:encodedDataPath error:&error];

经过测试,NSFileCreationDate这个属性是可以修改的;NSFileGroupOwnerAccountNameNSFileOwnerAccountName不能修改(真机为@"mobile");模拟器不可以修改两个属性,最大的可能性是因为模拟器运行产生的文件,权限不够修改文件属性;createDirectoryAtPath:withIntermediateDirectories:attributes:这个方法同样有这个限制。写入文件属性还有其他的限制,当文件在不同硬盘格式(HFS+ and FAT32)拷贝的时候,文件附带的属性可能会消失。

NSFileProtectionKey 是后台模式下的文件读写

为了开发方便,可以选择保存到NSUserDefault的方式。新建NSMutableDictionary,用文件作为key,用FileConfig作为value。FileConfig是验证相关的属性封装,便于后续开发。

1、NSUserDefault所有的属性最终会写入Libary/Preference/下的plist文件中,所以NSUserDefault中不能存储敏感信息。

2、如果遇到错误:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object那是因为NSUserDefault只能存基本类型,如果dict里面存有自定义类型,需要先转成NSData再存储;(plist里面没有结构信息,只有key-value)

1:检查一下你使用的验证签名的方法是否正确?

总结

任何手段都无法完全防止恶意的攻击,只能提高门槛。

bool signVerified = AlipaySignature.RSACheckV1(dic, alipay_public_key, config.charset);

附录

iOS使用Security.framework进行RSA 加密解密签名和验证签名

 

2:检查一下你传入的参数是否正确?

参数1:dic,把回调的参数保存到key,value集合中

Dictionary<string, string> dic = new Dictionary<string, string>();
var form = HttpContext.Current.Request.Form;
string str = "异步通知:rn";
foreach (var key in form)
{
   dic[key.ToString()] = HttpContext.Current.Request.Form[key.ToString()];
   var value = HttpContext.Current.Request.Form[key.ToString()];
   //记录日志使用
   str += $"{key.ToString()}:{value}rn";
}

参数2:alipay_public_key

这个参数是 支付宝公钥!!   很多小伙伴都写成了应用公钥,瞎几把写。

参数3:编码格式,UTF-8,这个一般没人会错。

 

本文由vnsc5858威尼斯城官网发布于vnsc5858威尼斯城官网,转载请注明出处:支付宝异步回调验证签名的那些走过的坑,iOS如

关键词:

上一篇:0与融云IMKIT开发问题

下一篇:没有了