| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> iOS开发 — JWT加密 -> 正文阅读 |
|
[移动开发]iOS开发 — JWT加密 |
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。 头部(Header) 头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 载荷(playload) 载荷就是存放有效信息的地方。 签证(signature) jwt的第三部分是一个签证信息,这个签证信息由三部分组成:1,需要base64加密后的header;2,base64加密后的payload;3,使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。 secret由前后端约定key,或者使用rsa的方式,使用密钥对;目前我们采用了约定key的方式。 注意??:关于base64加密,同一份内容使用不同语言加密得到的密文可能不相同,但是解析出来的内容相同; 例如:{"alg" : "HS256","typ" : "JWT"} 用OC加密后的密文是:ewogICJhbGciIDogIkhTMjU2IiwKICAidHlwIiA6ICJKV1QiCn0 用JAVA加密后的密文是:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 虽然密文不同,但是最终解析出来的内容是相同的。 出现这样的情况,也许与各种语言之间的编码方式有关系。具体原因仍需探究。 iOS开发 代码如下: +(NSString *)JWTEncodeString:(NSString *)deviceCodeStr { ? ? NSData *headerJsonData = [NSJSONSerialization dataWithJSONObject:@{@"alg":@"HS256",@"typ":@"JWT"} options:NSJSONWritingPrettyPrinted error:nil]; ? ? NSString *header1 = [XmSecretUtils safeUrlBase64Encode:headerJsonData]; ? ? NSData *palyloadJsonData = [NSJSONSerialization dataWithJSONObject:@{@"expireDate":[XmTimeUtils getCurrentTimeStamp],@"deviceCode":deviceCodeStr} options:NSJSONWritingPrettyPrinted error:nil]; ? ? NSString *palyload1 = [XmSecretUtils safeUrlBase64Encode:palyloadJsonData]; ?? ? ? ? NSString *signingInput = [@[header1, palyload1] componentsJoinedByString:@"."]; ? ? NSString *key = @"123456"; ? ? NSData *inputData = [signingInput dataUsingEncoding:NSUTF8StringEncoding]; ? ? NSData *secretData = [key dataUsingEncoding:NSUTF8StringEncoding]; ? ? NSData *signedOutputData = [XmSecretUtils signHash:inputData key:secretData error:nil]; ? ? NSString *signedOutput = [XmSecretUtils safeUrlBase64Encode:signedOutputData]; ? ? NSString *result = [@[header1, palyload1, signedOutput] componentsJoinedByString:@"."]; ?? ? ? ? WeeLog(@"sign~~~~~~~~~~~%@~~~~~~~~~~~~~~~~~~~",result); ? ? return result; } +(NSString*)safeUrlBase64Encode:(NSData*)data { ? ? // '+' -> '-' ? ? // '/' -> '_' ? ? // '=' -> '' ? ? NSString * base64Str = [QN_GTM_Base64 stringByEncodingData:data]; ? ? NSMutableString * safeBase64Str = [[NSMutableString alloc]initWithString:base64Str]; ? ? safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"]; ? ? safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"]; ? ? safeBase64Str = (NSMutableString * )[safeBase64Str stringByReplacingOccurrencesOfString:@"=" withString:@""]; ? ? NSLog(@"safeBase64编码:%@", safeBase64Str); ? ? return safeBase64Str; } + (NSData *)signHash:(NSData *)hash key:(NSData *)key error:(NSError *__autoreleasing *)error { ? ? size_t amount = CC_SHA256_DIGEST_LENGTH; ? ? size_t fullSize = amount * sizeof(unsigned char); ? ? unsigned char* cHMAC = malloc(fullSize); ? ? CCHmacAlgorithm ccAlg = kCCHmacAlgSHA256; ?? ? ? ? CCHmac(ccAlg, key.bytes, key.length, hash.bytes, hash.length, cHMAC); ?? ? ? ? NSData *result = [[NSData alloc] initWithBytes:cHMAC length:fullSize]; ? ? free(cHMAC); ? ? return result; } |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 | -2025/2/5 20:09:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |