华山论剑之iOS签名那点事

宁愿做过了后悔,也不要错过了后悔。
用团队的力量打开走向成功的大门

问题缘由:对于大多数初学者来说,签名一直都是一种高深莫测的技术,不是因为有多么的难,而是因为你不知道它干什么用的.那么签名到底是干什么用的呢?项目可能有对服务器的数据请求,有网络请求就会有网络接口,别人可以通过拦截,知道你的网络接口,然后不断的恶意的攻击的服务器,造成服务器的瘫痪.所以项目当中需要对网络请求进行保护,进而保护我们的服务器防止遭到恶意攻击.这就用到了我们的签名.


一、签名的使用范例


下面我们就使用GET请求服务器的方式对比一下有签名和没有签名的区别.

  • 没有添加任何保护的网络请求,请求接口讲解:请求项目当中在2016年五月二十七号的仓库总数.
http://192.168.1.150:8080/erp/warehouse?time=2016-05-27
  • 添加签名的网络请求保护,使用MD5对token进行一次加密形成签名.token字符串为DIFJSOYIMVCPAGUI
http://192.168.1.150:8080/erp/warehouse?time=2016-05-27&sign=f1d1d072866dcdf015b3edbd99273e21
小结:当我们看到了上面的添加了签名的网络接口,顿时觉得找个接口好复杂.好杂乱.但是因为token字符串是固定的,使用MD5加密不管你怎么搞,签名都是一样的,所以我们要寻找一些可以随意改变的量,那么有什么呢?随机数,时间戳.登录账号.登录密码(这个是万万不可的😂)等等.


二、签名的正确使用姿势


<b>

上面提到我们可以使用一些可变的量进行签名的制作,其实我就称之为要给签名加料,加料加到别人根本不知道签名是如何制作的.下面我就用一张图来说明一下签名的制作和使用过程.
签名加密正确姿势

(1) 从上图我们不难看出签名的制作时需要三个条件的.

  • 签名制作工具:签名制作工具无非就是MD5加密技术,Base64加密技术等,当然了使用什么技术加的密就要使用什么技术解密,这都是要前端人员和后台人员共同商量好的,要不你用MD5加密,他用Base64解密是肯定解不出来的.
  • 签名制作材料:签名制作材料当然是要就地取材了,需要从客户端中获取材料.比如随机数,时间戳等等,当然了,token这东西就不要作为参数传值了.(什么?token不太理解?好吧,我在下面讲解一下)
  • 签名加密规则:签名加密规则的保密等级应该是最高的,因为别人知道了你的加密规则之后你的网络请求参数就如同是赤裸裸的暴露在别人的面前,这是相当可怕的一件事情.服务器就在没有安全可言了.当然了,加密规则也是你跟后台商量好的,比如加密几次,字符串是怎么拼接的等等.
token:就是一个字符串,不作为参数,是前端人员和后台人员提前商量好的,记住,是提前商量好的,线下进行的!都知道有这个字符串,直接写在工程中就行.加密解密直接拿来用就行.


(2) 当我们制作好签名之后,我们就要进行网络请求了,然后把网络签名和时间戳作为参数传给后台,后台根据指定的解密工具和制定的解密规则(就是加密规则)进行解密获取里面的信息进行比对,比对成功,就返回对应的数据,比对不成功,也要返回数据,但是返回的是提醒数据,可以提醒用户"签名错误"等等.


三、MD5签名的代码实现


我在ViewController.m中进行签名的制作,以及服务器数据的请求(使用AFNetworking作为网络请求类),我们设定返回的JSON数据有result和msg两个字段,如果result为0则签名对比成功,否则为失败.msg为提示字符串.

//
//  ViewController.m
//  签名技术
//
//  Created by songjc on 16/6/10.
//  Copyright © 2016年 Don9. All rights reserved.
//

#import "ViewController.h"
#import <CommonCrypto/CommonDigest.h>
#import "AFNetworking.h"


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //调用网络请求
    [self networkWithData];
}

#pragma mark ---- 网络数据请求 -----

-(void)networkWithData{

    
    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]init];
    
    manager.responseSerializer  = [AFHTTPResponseSerializer serializer];
    
    // 设置超时时间
    [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    manager.requestSerializer.timeoutInterval = 10.f;
    [manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    
    //生成签名(用字典接受)
    NSDictionary *pkiDic = [self md5String];
    
    NSString *sign = pkiDic[@"PKI"];//签名
    
    NSString *timestamp = pkiDic[@"time"];//时间戳
    
    //设置请求参数(你看 token那个字符串根本就没出现在请求参数当中!!!!)
    NSDictionary *parameters = @{
                                 @"time":@"2016-05-27",
                                 @"sign":sign,
                                 @"timestamp":timestamp
                                 };
    
    
    [manager POST:@"http://192.168.1.150:8080/erp/warehouse" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        if (nil != responseObject) {
            
            NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
            
            if ([resultDic[@"result"]isEqualToString:@"0"]) {
                
                NSLog(@"签名正确!");
                
            }else{
            
            
                NSLog(@"签名不正确!");
            
            }
            
            
        }
        
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"未知错误");
        
    }];

}





#pragma mark-----加密工具以及加密规则-----

- (NSString *)md5:(NSString *)str
{
    const char *cStr = [str UTF8String];
    unsigned char result[16];
    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
    return [NSString stringWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
}

//加密规则:拼接token和当前时间戳,连续进行三次MD5加密
-(NSDictionary *)md5String
{
    NSString *token = @"DIFJSOYIMVCPAGUI";//token不需要作为参数进行网络传输
    
    //获取当前时间转化Wie时间戳
    NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
    NSTimeInterval a=[dat timeIntervalSince1970]*1000;
    NSString *timeString = [NSString stringWithFormat:@"%0.0f", a];
    
    NSString *md5mystr = [self md5:[NSString stringWithFormat:@"%@%@",token,timeString]];
 
    NSString *md5mystr2 = [self md5:md5mystr];

    NSString *md5mystr3 = [self md5:md5mystr2];

    
    //time为当前的时间戳,PKI为签名字符串
    NSDictionary *md5Dic = @{
                             @"time":timeString,
                             @"PKI":md5mystr3
                             };
    
    
    
    return md5Dic;
}


@end

为了防止上面的代码看的太累,所以我这里吧Demo的地址发给大家.

---->> 点击下载签名相关Demo

签名是一种网络请求安全措施,是我们作为一个前端人员必须的技巧,希望这篇文章能对您有帮助,如果有疑问可以在下方评论,我会及时回复的.谢谢
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容