iOS 对请求参数进行签名相关问题及对应解决方案

举报
iOS逆向 发表于 2021/10/27 16:55:11 2021/10/27
【摘要】 本文是梳理粉丝对博文:【对请求参数进行签名】请求参数按照ASCII码从小到大排序、拼接、加密(采用递归的方式进行实现)的相关问题及对应解决方案。

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

引言

本文是梳理粉丝对博文:【对请求参数进行签名】请求参数按照ASCII码从小到大排序、拼接、加密(采用递归的方式进行实现)的相关问题及对应解决方案。

demo地址:https://download.csdn.net/download/u011018979/15483107

I、签名数组ASCII码排序优化

1.1 优化数组元素的排序

记录一个用户反馈的bug,修改内容如下图:
在这里插入图片描述

数组的地方,我的规则是[] 表示数组,数组元素是用,分隔[,,,] 进行递归拼接的。
如果你认为数组ASCII码排序的地方是错误的话,你可以打印排序之后的字符串,看排序与你服务侧的拼接规则哪里不一样。把规则修改为与后台的数组排序规则一致即可。

/**
 - 处理key对应的Value是数组的情况

 */
+ (NSString *)sortedDictionaryArr:(NSArray *)arr {
    
    
    NSMutableString *contentString =[NSMutableString string];

    #pragma mark - ******** 可选

 arr =    [self sortedArrBykey:sortedArray];//

    for ( id obj in arr ) {
        
        
        
            NSString * tmp = @"";

            if(contentString.length<1 || [contentString isEqualToString:@""]){//
            
            
            
        }
        else{
            [contentString appendString:@","];
            
            
        }
        
        
        
        
              
                         if( [obj isKindOfClass:NSDictionary.class]){
                             
                    
                    
                    tmp = [self sortedDictionary:obj];
                             
                             
                    
                             
                    
                    
                    
                }
        
                // 数组就[]
                
                else         if( [obj isKindOfClass:NSArray.class]){
                    
                    
                    tmp = [self sortedDictionaryArr:obj];
                    

                                tmp = [NSString stringWithFormat:@"%@%@%@",@"{",tmp,@"}"];

                    
                }
                else{
            
            tmp=   obj;
            

            
        }



        
        
        
        [contentString appendFormat:@"%@",tmp];
        
        
        
    }
    
    
                        contentString = [NSString stringWithFormat:@"%@%@%@",@"[",contentString,@"]"];
    

    

    return contentString;
    
    
    
}

例子:编辑门店的商品的价格
请求报文:

{
  "adjustStocks" : [
    {
      "nnewStockNum" : "0",
      "productId" : "1280072986512433152",
      "newStockNum" : "0",
      "oldStockNum" : "0",
      "storeId" : "25063",
      "productSkuId" : "1280072986516627456",
      "batchNo" : ""
    }
  ],
  "modifyPrices" : [
    {
      "tagId" : "25063",
      "productNewPrice" : "5",
      "productSkuId" : "1280072986516627456",
      "type" : "1",
      "productId" : "1280072986512433152",
      "productOldPrice" : "33"
    }
  ]
}

签名元字符串的ASCII码排序

adjustStocks=[batchNo=&newStockNum=0&nnewStockNum=0&oldStockNum=0&productId=1280072986512433152&productSkuId=1280072986516627456&storeId=25063]&modifyPrices=[productId=1280072986512433152&productNewPrice=55&productOldPrice=5&productSkuId=1280072986516627456&tagId=25063&type=1]&appsecret=4f7b71

1.2 新增集合元素排序:

对于数组排序,我的初步想法是,先按照数组元素的class类型进行分组,其中的子数组是字符串类型的话,就对其进行排序之后再重新组合到新的数组中。然后再进行遍历递归拼接


/**
 
 1、新增集合元素排序:对于数组排序,我的初步想法是,先按照数组元素的class类型进行分组,其中的子数组是字符串类型的话,就对其进行排序之后再重新组合到新的数组中。然后再进行遍历递归拼接

 */
+ (NSMutableArray *)sortedArrBykey:(NSArray *)array {
    
    
    
        
    // 对数组先按照class类型进行排序
        
        //1)取出分组
    
//        NSArray *arDistinct = [array valueForKeyPath:@"@distinctUnionOfObjects.class"];//  无法获取到字典class类型
    
//    NSMutableArray *classArr = [NSMutableArray arrayWithArray:arDistinct];
    
    NSMutableArray *strclassArr = [NSMutableArray array];
    NSMutableArray *nostrclassArr = [NSMutableArray array];


    for (NSObject* obj in array) {
        
        
        if([obj isKindOfClass:NSString.class]){
            
            
            [strclassArr addObject:obj];
        }else{
            
            [nostrclassArr addObject:obj];
            

        }
        
    }
    

        //     4)按照日期进行分组
        NSMutableArray* sortedArray = [NSMutableArray array];
        
                    
    strclassArr = [strclassArr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){
                        return [obj1 compare:obj2 options:NSNumericSearch];
                        
                    }];
                    
                    

                    
         
                [sortedArray addObjectsFromArray:strclassArr];
    [sortedArray addObjectsFromArray:nostrclassArr];

                
                
         
    
    
    
    return sortedArray;
    
    
}



1.3 微信支付参数值为空不参与排序的处理方案

参数为空的 只要排序之前从字典移除即可。

规则的原因 :签名只对针对重要的字段,值可空的参数可不必参加

II、其他编译相关问题

2.1 为什么我下载demo后,在xcode12中允许报错:library not found for -lAXIndicatorView;请问怎么解决?

在这里插入图片描述

原因:这是找不到 CocoaPods库 AXIndicatorView。是 AXWebViewController库依赖于它

在这里插入图片描述
在这里插入图片描述

  • 解决方法: 你更新 pod ‘AXWebViewController’ 即可。

1、只更新指定的库,其它库忽略:pod update AXWebViewController --verbose --repo-update
2、pod update会更新所有的类库,获取最新版本的类库

cocoapods 用法文章:https://blog.csdn.net/z929118967/article/details/103830017

exit 0%                                                                                                                           ➜  retail git:(develop)cat ~/bin/knpod
#!/bin/sh

#该命令只安装新添加的库,已更新的库忽略

pod install --verbose --no-repo-update
#该命令只更新指定的库,其它库忽略
#pod update 库名 --verbose --no-repo-update

exit 0%                                                                                                                           ➜  retail git:(develop)

see also

更多资讯和服务请关注#小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域。

更多资源下载请访问博客:https://kunnan.blog.csdn.net/article/details/120680068

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。