支付宝异步回调验证签名的那些走过的坑,iOS如何保证下载资源的可靠性

public static bool RSACheckContent(string signContent, string sign, string publicKeyPem, string charset, string signType)
{

    try
    {
        if (string.IsNullOrEmpty(charset))
        {
            charset = DEFAULT_CHARSET;
        }

        if ("RSA2".Equals(signType))
        {
            //这里就是要改的地方
            //从参数获取
            string sPublicKeyPEM = publicKeyPem;
            //从文件获取
            //string sPublicKeyPEM = File.ReadAllText(publicKeyPem);
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.PersistKeyInCsp = false;
            RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsa, sPublicKeyPEM);

            bool bVerifyResultOriginal = rsa.VerifyData(Encoding.GetEncoding(charset).GetBytes(signContent), "SHA256", Convert.FromBase64String(sign));
            return bVerifyResultOriginal;

        }
        else
        {
            //这里就是要改的地方
            //从参数获取
            string sPublicKeyPEM = publicKeyPem;
            //从文件获取
            //string sPublicKeyPEM = File.ReadAllText(publicKeyPem);
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.PersistKeyInCsp = false;
            RSACryptoServiceProviderExtension.LoadPublicKeyPEM(rsa, sPublicKeyPEM);

            SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
            bool bVerifyResultOriginal = rsa.VerifyData(Encoding.GetEncoding(charset).GetBytes(signContent), sha1, Convert.FromBase64String(sign));
            return bVerifyResultOriginal;
        }

    }
    catch (Exception e)
    {
        NLogGetter.NLog.ErrorLog(e);
        return false;
    }

}

前言

有的时候候须要在该地存款和储蓄能源,并且从服务器下载财富,因为涉及到运转时期的安全性,有不能够紧缺增加校验的逻辑,由此有了本文的片段用脑筋想。

这么些参数是 支付宝公钥!!   超级多同伙都写成了动用公钥,瞎几把写。

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通过动用代理,能够很方便的改换下载的财富。为了有限支撑下载财富的可相信性,采纳了风度翩翩套基于TucsonSA算法的证实方案,具体的要领有:1、开采者发生意气风发对密钥:公钥和私钥,私钥保存在布局平台,公钥放到客商端。2、当文件上传出配置平台后,配置平台对文本进摘要拿到md5str,并私钥对md5str举行签订公约获得signStr,然后把
文件和signStr下发给顾客端。3、顾客端下载文件和signStr,计算文件的摘要获得md5str,用md5str和公钥验证signStr的得力。

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

图片 2

EnclaveSA算法的二种加密方法:

  • 公钥加密,私钥解密。(平时用来公钥持有方向私钥持有者
  • 私钥加密,公钥解密。(平时用来具名和验证,私钥加密相当于签约,公钥解密也正是验证)

苹果提供的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);

因为牧马人SA算法的总计量相当大,日常不会直接接收奔驰M级SA对数码实行加密,而是对AES的密匙实行加密,再用AES对数码加密。HighlanderSA算法原理
,这里有意气风发篇详细介绍途达SA算法原理的文章。

得到后台下发的签名后,就需要保留签名,能够筛选:保存在文书中、保存到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)

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

总结

其余手腕都爱莫能助完全制止恶意的大张征讨,只好进步门槛。

签订验证错误的反省各种(这里是依赖使用官方给的demo,自身包裹的请绕道):

附录

iOS使用Security.framework实行昂CoraSA
加密解密签名和认证具名

sign_type,那些就是解码类型,demo写的切近“CRUISERSA”,笔者这边改成动态获取了,我们在开始时代配置的地点也会配备加密类型,从哪获取都足以,别弄错了就可以。

1:检查一下你使用的申明签名的艺术是还是不是科学?

3:检查一下你的条件,沙盒情状照旧线上情形,沙盒景况会出错,具体怎么小编不领会,百度来的。要在开采宝中给您的回调域名授权,不授权人家懒得回调给你。

string alipay_public_key = "-----BEGIN PUBLIC KEY-----rn" + config.alipay_public_key + "-----END PUBLIC KEY-----rnrn";
bool signVerified = AlipaySignature.RSACheckV1(dic, alipay_public_key, config.charset);

 

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

2:检查一下你传入的参数是或不是准确?

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";
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注