iOS 安全规范指南之【对请求参数进行签名】

347 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言

支付类app为了安全起见,除了使用【防代理分析请求数据】,还可采用签名的方式进一步进行限制防止请求和返回报文被修改。

iOS请求安全防护【1、 防代理分析请求数据 2、SSL证书认证3、采用签名禁止修改报文4、不在本地缓存网络请求报文5、利用NSURLProtocol 拦截请求修改HTTPHeaderField】 文章地址: https://blog.csdn.net/z929118967/article/details/102511852

  • 应用场景:防止请求参数被恶意修改

在对接第三方支付的时候,第三方会要求参数按照ASCII码从小到大排序。

1、银联的退款接口签名:https://kunnan.blog.csdn.net/article/details/115084885 ◆ key:签名时用机构对应的密钥key ◆签名算法:MD5,后续会兼容SHA1、SHA256、HMAC等

2、微信支付接口签名:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3 ◆ key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 ◆注:HMAC-SHA256签名方式,部分语言的hmac方法生成结果二进制结果,需要调对应函数转化为十六进制字符串 ◆生成随机数算法:调用随机数函数生成,将得到的值转换为字符串。 ◆使用openssl命令来自己导出pem证书(p12 to pem):openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem ◆ 微信支付接口签名校验工具 :https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1

  • 原文

blog.csdn.net/z929118967/…

从CSDN下载demo地址:https://download.csdn.net/download/u011018979/15483107

1、demo 数组用[]表示,对象(字典)用{} 表示进行排序拼接。

2、数组排序可选,数组内部,只对字符串元素进行排序,并不与字典key参与排序。 字典和数组独立排序

  • 参数
    NSDictionary *params = @{@"sid" :  @"iOS逆向",
                             @"certificateInfoList" :  @"https://kunnan.blog.csdn.net/article/details/108195721" ,
                             @"storePicsList" : @"https://kunnan.blog.csdn.net" ,
                             };

  • 效果

2021-02-26 15:43:42.208991+0800 SignatureGenerator[16231:1928569] 按照参数名ASCII码从小到大排序:《certificateInfoList=https://kunnan.blog.csdn.net/article/details/108195721&sid=iOS逆向&storePicsList=https://kunnan.blog.csdn.net》


2021-02-26 15:43:42.209280+0800 SignatureGenerator[16231:1928569] sign:195b9caecc41681ebd1b74261f858052

I 实现

1.1 思路

kunnan.blog.csdn.net/article/det…

1.2 签名demo 下载地址

从CSDN下载demo地址:https://download.csdn.net/download/u011018979/15483107

private : https://github.com/zhangkn/SignatureGenerator

可关注gz号:iOS逆向,联系我获取java demo

github.com/zhangkn/web…

II 应用

2.1 用法

@interface KNSignatureGenerator : NSObject
/**
 
 
 iOS app侧对请求参数进行签名:【请求参数按照ASCII码从小到大排序、拼接、加密】
 (采用递归的方式进行实现)

 */

+ (NSString *)getSortedDictionary4Sign:(NSMutableDictionary *)originParam ;


@end

  • 将请求参数按照ASCII码从小到大排序、拼接及加密 并返回设置到请求头sign
    if([params isKindOfClass:NSDictionary.class]){
        
        [req setValue:[SignatureGenerator getSortedDictionary4Sign:params] forHTTPHeaderField:@"sign"];//  post 请求 在   header  加上 sign


        
    }
    

2.2 指定特定接口集合进行签名

短信验证接口新增请求参数签名,防止短信轰炸。

    NSString *url = req.URL.absoluteString;
    NSString *separate =@"/api/";// 由于API格式统一是 /api/xxx/xxx,因此可以简单的采用字符串分割即可。
    url = [url componentsSeparatedByString:separate].lastObject;
    url= FMSTR(@"%@%@",separate,url);// 这里可以拼接上分隔符之后直接调用数组的containsObject方法进行比较,也可以采用谓词技术进行匹配https://blog.csdn.net/z929118967/article/details/74066170
    NSLog(@"sign_relativeString:%@",url);
    // 判断[list containsObject:url]

2.3 应用案例:iOS条码支付综合前置平台【被扫支付 / 申请退款】

iOS条码支付综合前置平台【被扫支付 / 申请退款API】指南

kunnan.blog.csdn.net/article/det…

see also

公众号:iOS逆向