开启掘金成长之旅!这是我参与「掘金日新计划 · 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
- 原文
从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 思路
1.2 签名demo 下载地址
从CSDN下载demo地址:https://download.csdn.net/download/u011018979/15483107
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】指南
see also
公众号:iOS逆向