App 常用签名设计

前言

一般来说,客户端 App 与服务器端是通过接口进行交互,来互相传递数据的,而为了保证数据的安全性,一般都会专门设计一个签名规则。

三种安全强度的签名设计

第一种:客户端加密(对称加密,如 AES),服务端解密,配合 token 和流水号

优点:能够保持用户登录状态、区分用户,相对于不返回任何信息的登录要安全了一些。

缺点:如果通过网络嗅探器(例如:青花瓷)可以获取到http链接,会造成信息泄露,并且还能被伪造请求。

第二种:客户端加密(非对称加密,如 RSA),服务端解密,配合 token 和流水号

采用 RSA 非对称加密。具体流程如下:

  • 客户端向服务器第一次发起登录请求(不传输用户名和密码)。

  • 服务器利用RSA算法产生一对公钥和私钥。并保留私钥, 将公钥发送给客户端。

  • 客户端收到公钥后, 加密用户密码, 向服务器发起第二次登录请求(传输用户名和加密后的密码)。

  • 服务器利用保留的私钥对密文进行解密,得到真正的密码。

第三种:非对称加密 + token + 流水号

前两种方法如果 token 被截获了,那么他人完全就能够模拟出用户的请求,所以在服务器向客户端发送的 token 数据,也需要加密。

具体流程如下:

  • 客户端向服务器第一次发起登录请求(不传输用户名和密码),服务器利用RSA算法产生一对公钥和私钥,并保留私钥,将公钥发送给客户端。

  • 客户端收到公钥后,加密用户密码,向服务器发送用户名和加密后的用户密码; 同时另外产生一对公钥和私钥,自己保留私钥, 向服务器发送公钥,于是第二次登录请求传输了用户名和加密后的密码以及客户端生成的公钥。

  • 服务器利用保留的私钥对密文进行解密,得到真正的密码。经过判断, 确定用户可以登录后,生成sessionId和token,同时利用客户端发送的公钥,对token进行加密。最后将sessionId和加密后的token返还给客户端。

  • 客户端利用自己生成的私钥对token密文解密,得到真正的token。

实践

从签名强度来看,上面方法第三种 > 第二种 > 第一种,所以此处省略第一二种实践方式,主要看看第三种。

流程

具体的实践分为登录(拿 token) 和与用户信息相关的接口加密(AES) ,比上文第三种签名方式,多出一步 AES 加密:

  • 1.客户端向服务器第一次发起登录请求(注意这里是登录请求,不是调登录接口)。

  • 2.服务器生成公私钥对(公钥1、私钥1),将公钥1发送给客户端。

  • 3.客户端收到公钥1后,加密用户密码,同时本地生成公私钥对(公钥2、私钥2),调用登录接口,将公钥2和用公钥1加密过后的用户密码发给服务端。

  • 4.服务器用私钥1对密文进行解密,得到真正的密码。经过判断,确定用户可以登录后,生成 sessionId 和 token,同时用客户端发送的公钥2,对 token 加密,最后将 sessionId 和加密后的 token 以及 AES 密钥返给客户端。

  • 5.客户端用私钥2解密,得到 token 、sessionId、AES 密钥。

  • 6.登录流程结束,本地存储有公钥1、公钥2、私钥2、AES 密钥、sessionId 和 token。

密钥传递与处理

首先要明确 RSA 公私钥密文格式,这里建议客户端和服务端统一使用字符串,即公私钥在客户端是以字符串的形式传递的。

其次,本地存储的公钥1、公钥2、私钥2、AES 密钥、sessionId 和 token,建议统一放到 keychain 中去,防止泄露。

密钥生成

利用 OpenSSL 在客户端生成 RSA 密钥对时,并没找到方法将密钥(SecKeyRef)转成字符串(若您找到了,请告知于我,不胜感激),所以在这用了一个取巧的方法:将公私钥保存为本地文件,然后再从这个文件中读取出来。

#pragma mark - 本地生成 RSA 公私钥对
+ (NSArray *)generateKeys {
    RSA *rsa = NULL;
    rsa = RSA_new();
    rsa = RSA_generate_key(1024,0x10001,NULL,NULL);
    // 路径
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
    //获取公钥字符串
    NSString *pubPath = [documentsPath stringByAppendingPathComponent:@"PubFile.txt"];
    FILE *pubWrite = NULL;
    pubWrite = fopen([pubPath UTF8String],"wb");
    if(pubWrite == NULL) {
        NSLog(@"Read Filed.");
    }else{
        PEM_write_RSA_PUBKEY(pubWrite,rsa);
        fclose(pubWrite);
    }
    NSString *publicStr = [NSString stringWithContentsOfFile:pubPath encoding:NSUTF8StringEncoding error:nil];
    publicStr = [publicStr stringByReplacingOccurrencesOfString:@"-----BEGIN PUBLIC KEY-----"withString:@""];
    publicStr = [publicStr stringByReplacingOccurrencesOfString:@"-----END PUBLIC KEY-----"withString:@""];
    publicStr = [publicStr stringByReplacingOccurrencesOfString:@"\n"withString:@""];
    //获取私钥字符串
    NSString *priPath = [documentsPath stringByAppendingPathComponent:@"PriFile.txt"];
    FILE *priWtire = NULL;
    priWtire = fopen([priPath UTF8String],"wb");
    EVP_PKEY *pkey = NULL;
    if(priWtire == NULL) {
        NSLog(@"Read Filed.");
    }else{
        pkey =EVP_PKEY_new();
        EVP_PKEY_assign_RSA(pkey, rsa);
        PEM_write_PKCS8PrivateKey(priWtire, pkey,NULL,NULL,0,0,NULL);
        fclose(priWtire);
    }
    NSString *privateStr = [NSString stringWithContentsOfFile:priPath encoding:NSUTF8StringEncoding error:nil];
    privateStr = [privateStr stringByReplacingOccurrencesOfString:@"-----BEGIN PRIVATE KEY-----"withString:@""];
    privateStr = [privateStr stringByReplacingOccurrencesOfString:@"-----END PRIVATE KEY-----"withString:@""];
    privateStr = [privateStr stringByReplacingOccurrencesOfString:@"\n"withString:@""];
    
    return @[publicStr,privateStr];
}

最后

以上只是较常用三种安全强度的签名设计,真正 App 签名设计远远不止这三种,比这些安全强度高的也有许多,继续学习。

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

推荐阅读更多精彩内容