iOS进阶_密码学(二.钥匙串访问)

2023-11-09

网络开发中的原则:

  • 在网络上不允许传输用户的明文隐私数据
  • 在本地不允许保存用户的明文隐私数据

类似于QQ,微信的记住密码,在客户端本地保存用户加密后的密码

  1. NSUserDefaults – 明文保存才能反算(能够反算的算法)
  2. 钥匙串访问 – 开放给开发者是 7.0.3版本

—————————– 保存在本地 ————————

钥匙串访问:

  1. 苹果的”生态圈”,从 iOS7.0.3 版本开放给开发者!
  2. 功能:在Mac上能够动态生成复杂密码,帮助用户记住密码!
  3. 如果用户访问网站,记住密码,我们还可以看到记住的密码明文!明文记录
  4. 本身的所有接口都是 C 语言的.借助三方库
  5. 采用的加密方式是 AES 加密!

使用钥匙串访问,我们可以使用一个三方库SSKeychain,复制到程序中,在文章的最后会给出

这里写图片描述

在应用程序中打开钥匙串服务

这里写图片描述

演示代码:

#import "ViewController.h"
#import "NSString+Hash.h"
#import "SSKeychain.h"

@interface ViewController ()
@property(nonatomic,copy)NSString * user;
@property(nonatomic,copy)NSString * pwd;
@end

@implementation ViewController

//盐
static NSString * salt =@"*DJSF(*QYEWOIOAJ()*)ASDASDASD";

- (void)viewDidLoad {
    [super viewDidLoad];
    //发给服务器校验!
    self.user = @"user";
    self.pwd = @"123456";
//    pwd=[pwd stringByAppendingString:salt];
//    pwd=pwd.md5String;
    //加密!直接MD5加密

    //直接发送给服务端pwd可以嘛?
    //答案是不可以,因为虽然MD5是不可逆的,但是一些简单的密码转换成哈希值之后是固定的,有大量的网站依然可以匹配出你加密后的哈希,然后找到你的原密码。那有没有方法解决呢?我们可以进行“加盐”

    //如果盐被泄露呢?那就严重了,所以肯定不能使用固定的盐
    //我们尝试另一种方式:HMAC
//    self.pwd =[self.pwd hmacSHA1StringWithKey:@"hank"];
    //(HMAC密码+服务器时间戳+盐(服务器和客户端商议))md5
    //服务端存储用户名 key HMAC密码
    //服务端验证:1.(HMAC密码+服务器时间戳(时间戳只到分钟)+key(服务器和客户端商议)MD5
    //2.(HMAC密码+服务器时间戳(上1分钟)+key(服务器和客户端商议)MD5
//     NSLog(@"加密之后:%@",self.pwd);

    /*
     非对称加密算法
     一.运行终端,生成私钥
     1.cd /Users/mac/Desktop/iOS/加密
     2.openssl genrsa -out private.pem 512 //生成私钥,注意:这个私钥其实是放在服务器的
     3.openssl rsa -in private.pem -out public.pem -pubout //通过2生成的私钥获取公钥
     4.我们会发现已经在加密文件下,创建成功了两个文件
     5.cat private.pem  //打开私钥,可以看见base64编码的文件格式
     6. openssl rsa -in private.pem -text -out private.txt  //转换成明文格式打开看看
     RSA加密使用效率偏低,它有哪些应用场景呢?
     我们都知道私钥是放在服务端的,公钥是在客户端的。何为公钥?公钥可以理解为公共钥匙,任何客户端都可以向服务器获取公钥。当你的项目在被做逆向的时候,其他人就可以模仿客户端来获取公钥,所以没有绝对的安全,只有相对的安全。因此我们的重要数据仍然需要做加密处理。我们知道OC的方法调用和函数调用是不一样的,方法调用可以显示方法名,而函数调用则返回的是内存地址。所以在大公司中,一些核心算法都是使用的C。
     */

    //模拟网络请求用户登录成功后,保存密码
    //明文账户密码
    [self savePwdWithAccunt:self.user pas:self.pwd];

    //第二次登录 - 加载本地用户信息
    [self loadUserInfo];
}

//加载本地用户信息
-(void)loadUserInfo{
    //加载账户
    self.user = [[NSUserDefaults standardUserDefaults] stringForKey:@"BundelID"];
    //钥匙串访问方法:找出所有账户
    self.pwd = [SSKeychain passwordForService:@"BundelID" account:self.user];
    NSLog(@"%@",[SSKeychain allAccounts]);
    NSLog(@"%@",self.pwd);
    /*
     2018-05-15 17:09:50.522587+0800 001-登录(MD5)[15894:1009983] (
     {
     accc = "<SecAccessControlRef: 0x604000430080>";
     acct = user;
     agrp = "XV99QKSRHM.com.audition.www.-01----MD5-";
     cdat = "2018-05-15 09:09:49 +0000";
     mdat = "2018-05-15 09:09:49 +0000";
     musr = <>;
     pdmn = ak;
     persistref = <>;
     sha1 = <29d75170 a70839b0 33d12e4c 81e88bee 7a350bf6>;
     svce = BundelID;
     sync = 0;
     tomb = 0;
     }
     )
     */
}
//保存账户密码
-(void)savePwdWithAccunt:(NSString *)accunt pas:(NSString *)pwd{
    //保存账户
    [[NSUserDefaults standardUserDefaults] setObject:accunt forKey:@"BundelID"];
    //同步
    [[NSUserDefaults standardUserDefaults] synchronize];

    //保存密码
    if (accunt > 0 && pwd.length>0) {

        /**
         钥匙串保存密码
          参数
          1.密码明文
          2.服务,可以随便写,但是它是App的一个标识,建议使用BundelID
          3.账户,用户名
         */
        [SSKeychain setPassword:pwd forService:@"BundelID" account:accunt];
    }
}
@end

SSKeychain GitHub地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS进阶_密码学(二.钥匙串访问) 的相关文章

  • iOS进阶_密码学进阶(一.对称加密算法简介)

    加密算法 HASH 散列函数 不可逆 密码 识别 文件 识别 以下两种加密算法 都是可逆的 明文 gt 加密 gt 密文 密文 gt 解密 gt 明文 对称加密 传统加密算法 加密和解密使用同一个 密钥 密钥的保密工作就非常的重要 密钥会定
  • iOS进阶_密码学(四.抽取登录网络请求的单例)

    登录业务逻辑完善 在网络开发中 一般会有一个单例负责所有的网络请求 将这个网络登录的部分代码抽取出来 新建一个 类 复制方法 调整参数 测试登录能否成功运行 WTNetworkTools h import
  • iOS架构师_UML建模语言

    UML UML统称建模语言 面向对象软件的表转化建模语言 包含Booch MOT OOSE 工具 StarUML 时序图
  • iOS进阶_GCD(二.GCD串行队列&并发队列)

    GCD 核心概念 将任务添加到队列 指定任务执行的方法 任务 使用block封装 block 就是一个提前准备好的代码块 在需要的时候执行 队列 负责调度任务 串行队列 一个接一个的调度任务 并发队列 可以同时调度多个任务 任务执行函数 任
  • iOS进阶—Runtime基础

    iOS进阶 目录 GitHub参考 RunTime 基础 一个程序的执行过程 大概就是代码 gt 编译链接 gt 执行 C语言 import
  • iOS进阶_WebDav(五.WebDav的上传进度&多线程下载思路)

    WebDav的上传进度 import ViewController h interface ViewController
  • iOS架构-组件化(项目实战-项目首页架构)

    UI架构设计 设计模式 外观模式 代理模式 适配器模式 adapter 注意 一版本只是搭建结构 一 1 0 Tab搭建 二 1 1 新增UICollectionView 主页 gt 整体设计基于 gt UICollectionView 滑
  • iOS开发_HOOK

    我们在使用NSURLRequest时 传入请求地址URL 但是如果URL中有中文的话 我们会发现NSURLRequest的请求地址会报空 void viewDidLoad super viewDidLoad NSURL url NSURL
  • iOS进阶—Runtime源码解析:动态方法解析

    GitHub参考 PS 参考GitHub分享的objc runtime master代码 及Runtime003代码 iOS进阶 目录 接上文iOS进阶 Runtime源码解析 消息发送 查看Runtime源码 No implementat
  • iOS核心动画CoreAnimation系统进阶(赛贝尔曲线-菜单侧滑动画拆分动画详解)

    我们知道动画是基于绘制的 多次绘制贝塞尔的过程就会形成动画 流畅的动画效果会给用户带来不一样的使用体验 下面我们就让App开发中经常使用到的侧滑动画进行拆分详解 效果图如下 为侧滑动画封装一个slideMenuView 绘制侧滑动画需要下面
  • iOS架构-组件化(Carthage管理工具)

    一 Carthage项目管理工具使用 Step 1 安装 更新Homebrew工具 1 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install ma
  • iOS进阶_密码学(二.钥匙串访问)

    网络开发中的原则 在网络上不允许传输用户的明文隐私数据 在本地不允许保存用户的明文隐私数据 类似于QQ 微信的记住密码 在客户端本地保存用户加密后的密码 NSUserDefaults 明文保存才能反算 能够反算的算法 钥匙串访问 开放给开发
  • iOS进阶_NSURLConnection(被弃用的原因:Connection的缺点)

    NSURLConnection下载 我们在前面的文章中介绍了MAC电脑搭建Apache服务器 在Sites文件夹中放置一个视频文件MVVM mp4 pbb 通过NSURLConnection进行下载 访问http localhost 我们可
  • iOS开发之ReactiveCocoa框架(RAC)第五篇队列与高级函数

    h文件 import ViewController h import ReactiveCocoa interface ViewController end implementation ViewController void viewDid
  • iOS开发之Runtime运行时机制

    摘要 Objective C是基于C加入了面向对象特性和消息转发机制的动态语言 除编译器之外 还需用Runtime系统来动态创建类和对象 进行消息发送和转发 作者通过分析Apple开源的Runtime代码来深入理解OC的Runtime机制
  • iOS进阶_密码学进阶(三.非对称加密算法-RSA公钥私钥的生成)

    应用场景 集成支付宝SDK 会看见 p12文件也有 非对称加密算法 一 运行终端 生成私钥 1 cd Users mac Desktop iOS 加密 2 openssl genrsa out private pem 512 生成私钥 注意
  • iOS开发 多线程的高级应用-信号量semaphore

    在iOS开发的道路上 多线程的重要性不言而喻 大部分我们都停留在基础的使用上面 缺乏高级应用 缺乏提升 是因为我们面对他太少 复杂的事情重复做 复杂的事务基础化 差距就是这样拉开了 言归正传 今天讲讲GCD的高级应用之信号量篇 一 信号量的
  • iOS进阶_NSURLSession(二.断点续传)

    断点续传 从上一篇文章中 我们了解了使用NSURLSession进行文件下载 我们在其基础上继续探索NSURLSession的断点续传 在NSURLSession中 我们使用reumeData来存储下载的数据进度 import ViewCo
  • iOS进阶_kvc使用注意事项

    细节1 我们在项目中使用kvc 在设置model属性的时候 注意尽量不要使用基本数据类型 实例 数据模拟 注意age是null类型的 Person h import
  • iOS架构-组件化(项目框架搭建2)

    静态库引用静态库 如果像上图一样 直接在业务层组件引用数据层组件的文件 则会报错 因为组件之间没有建立引用关系 如下图 静态库如何引用Pods第三方库 拷贝Podfile文件到项目 打开终端执行pad install 直接引用Pod下面的Y

随机推荐

  • 04C++中模板和STL介绍

    模板和STL是C 比较重要的部分 本章仅做简单了解 文章目录 一 模板 1 1 函数模板 1 1 1 两种函数模板的实例化 1 1 2 模板参数的匹配原则 1 2 类模板 二 STL 一 模板 对于一个交换函数 虽然C 支持函数重载 我们可
  • Microsoft MSDT任意代码执行漏洞(CVE-2022-30190)

    Microsoft Windows 支持诊断工具 MSDT 远程代码执行漏洞复现过程 漏洞描述 MSDT Microsoft Support Diagnostics Tool 微软支持诊断工具 是一种实用程序 用于排除故障并收集诊断数据以供
  • ROW_NUMBER() OVER函数的基本用法 / Rank() over()的用法

    转自 http www cnblogs com icebutterfly archive 2009 08 05 1539657 html 语法 ROW NUMBER OVER PARTITION BY COLUMN ORDER BY COL
  • Processing如何打包导出中文字体

    Processing如何打包导出中文字体 文章目录 Processing如何打包导出中文字体 原理 步骤 用途 原理 使用Processing自带的字体创建工具 创建 vlw字体 该工具为每个character创建一个贴图 然后将它们作为
  • 教你如何根据需求编写测试用例,不用写一行代码,使用ChatGPT4自动完成。

    首先来张效果图 需求我是放到requirements txt文档里 输出的测试用例是放到test case1 txt 整个代码我是让ChatGPT4自动给我写的 我用的prompt提示语是 我的想法是这样 通过Python代码 和API k
  • Android中的指纹识别

    1 第一步首先在build gradle中导入咱们的指纹识别依赖 dependencies implementation androidx appcompat appcompat 1 1 0 implementation com googl
  • 什么是线程同步和线程异步?

    1 什么是线程同步和线程异步 线程同步 是多个线程同时访问同一资源 等待资源访问结束 浪费时间 效率不高 线程异步 访问资源时 如果有空闲时间 则可在空闲等待同时访问其他资源 实现多线程机制 异步处理就是 你现在问我问题 我可以不回答你 等
  • C++11中enable_shared_from_this的用法解析

    什么是 enable shared from this 下面摘自 cpp reference 中概述 C 11 开始支持 enable shared from this 它是一个模板类 定义在头文件
  • RestHighLevelClient集成ES 7.X

    Maven依赖 依赖版本号和elasticsearch版本号对应起来
  • java基础三(运算符)

    标识符 在Java语言中 与类无关的运算符只有赋值运算符 算术运算符 关系运算符 逻辑运算符和位运算符 赋值运算符 符号为 作用是将数据 变量或对象赋值给相应类型的变量或对象 例如 int a 5 将数据复制给变量 long b a 将变量
  • jmeter切换JDK版本

    tomcat设置固定的JDK tomcat bin vi setclasspath sh 最上面添加可以生效 export JAVA HOME usr local jdk1 8 0 131 export JRE HOME usr local
  • 肖飒:央行数字货币与反洗钱,你怎么看?

    商务部在今年8月14日印发的 全面深化服务贸易创新发展试点总体方案 中提到 在京津冀 长三角 粤港澳大湾区及中西部具备条件的试点地区开展数字人民币试点 而就在几天前 深圳罗湖数字人民币红包活动正式落幕 中国数字货币在深圳打响了 第一枪 10
  • JAVA单元测试框架-11-异常测试

    预计测试会出现异常 可以使用 Test expectedExceptions 来验证是否有异常抛出 import org testng Reporter import org testng annotations DataProvider
  • AIGC之常见LLM免费使用

    文章目录 1 前言 2 常见LLM免费使用方法 部分网站需要使用魔法 2 1 GPT 4 GPT 3 5 16k国内镜像 2 2 GPT 3 5 国内镜像 2 3 LLM国外综合网站 3 总结 1 前言 自从ChatGPT在2022年底横空
  • 【App端】uni-app使用百度地图api和echarts省市地图下钻

    目录 前言 方案一 echarts 百度地图 获取百度地图AK 安装echarts和引入百度地图api 完整使用代码 方案二 echarts地图和柱状图变形动画 实现思路 完整使用代码 方案三 中国地图和各省市地图下钻 实现思路 完整使用代
  • SpringBoot中启动类的存放位置

    如有错误 请多指教 不能直接放在main java 文件下 启动类所在的包是最顶部的包 不能直接放在main java 文件下 ps BootQueueConsumerApplication是启动类 否则会直接报错 如下图 启动类所在的包是
  • java jdbc 故障转移,MySQL JDBC连接上的故障转移?

    I am trying to determine how i could implement a high availablity solution using the MySQL JDBC driver it seems that the
  • 最全的Java笔试题库之选择题篇-总共234道【121~180】

    121 EJB的优点有哪些 选择2项 A 技术领先 B 价格低廉 C 性能优越 D 强大的容器支持 解答 CD 122 以下哪些接口能够实现对Web访问者的身份认证 选择1项 A Http Servlet Request B Http Se
  • Linux用户切换到root后运行图形程序报错(*GLib-GIO-CRITICAL **)

    用su切换到root用户后 运行某些带图形的程序 会报如下错误 ImageProc qt 3158 GLib GIO CRITICAL g dbus connection register object assertion G IS DBU
  • iOS进阶_密码学(二.钥匙串访问)

    网络开发中的原则 在网络上不允许传输用户的明文隐私数据 在本地不允许保存用户的明文隐私数据 类似于QQ 微信的记住密码 在客户端本地保存用户加密后的密码 NSUserDefaults 明文保存才能反算 能够反算的算法 钥匙串访问 开放给开发