IOS安全编程之Keychain基本概念

2024-09-06 00:48

本文主要是介绍IOS安全编程之Keychain基本概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有时候我们的程序可能会在iphone上存储一些敏感或认证信息,比如登录密码,网站认证书,用于信息加解密的私钥等。有些信息不能以明文来存储,最好是我们能把这些信息加密起来,然后存到一个安全的地方。

那么我们把他们放在那里呢?IOS系统为我们提供了一个保险柜——Keychain即钥匙串。Keychain提供了一种机制,让我们可以将这些敏感数据存放到Keychain中,对于有必要加密的信息,会被IOS自动加密(即使是在做数据备份时,其内容仍然是加密过的,但对于证书之类的信息,并没有必要加密,所以会被以明文来存储)。在整个IOS系统中,只有一个全局性的Keychain(OS X中可以用户创建多个Keychain,关于OS X与IOS区别,我们不多考虑),在这个Keychain中,存储了所有IOS 程序的的加密处理过的敏感信息,我们称之为Keychain item,其中每个App程序仅能够访问他自己的Keychain item(不过我们可以通过某种方法在程序间传递Keychain item)。


那么都是什么数据信息可以被存放在Keychain里保护起来呢?在Keychain机制中,通过kSecClass来指明保存的数据信息类型,目前共支持五种信息类型:

kSecClassGenericPassword  used to store a generic password
kSecClassInternetPassword used to store an internet password
kSecClassCertificate      used to store a certificate
kSecClassKey              used to store a kryptographic key
kSecClassIdentity         used to store an identity (certificate + private key)

好了,我们现在有了Keychain是什么的基本概念—— 一个用于存储敏感信息的保险箱,IOS中仅存在一个全局性的Keychain,对于有加密必要的数据,IOS会进行加密,每个IOS程序只能够访问属于他自己的Keychain item。

Keychain item的数据结构

前面所说,Keychain中所存储的条目,被称之为Keychain item,其实是一个字典似得数据结构,即一个key对应一个value,我们操作Keychain中的数据的时候,也是以字典的结构来进行操作的。

Keychain item中存储的数据可以划分为三个区域:

  • 一个表明存储的数据类型,其key前缀为kSecClass*
  • 一组描述数据信息的属性,其key前缀为kSecAttr*
  • 存储敏感数据的内容,其key前缀为kSecValue*



如何操作Keychain

Keychain背后的实现机制虽然很复杂,但对于使用者的我们来说,他只是一个保险箱用来存储敏感数据,我们只需要能够对Keychain进行增删查改的操作即可了,对应的,IOS的Keychain Service API提供如下四个函数

    SecItemCopyMatching  // 查询SecItemAdd           // 添加SecItemUpdate        // 更新SecItemDelete        // 删除


Keychain的实现支持,是使用SQLite数据库的,因此就像SQL语句一样,我需要指明条件来说明我们要进行操作的Keychain item。(通过kSecClass和对应的kSecAttr来指明)

在我们对Keychain item进行操作时,一般的步骤如下:

1、创建一个NSMutableDictionary对象,用于存储或用来设置query条件
2、设置kSecClass,指明我需要获取什么类型数据
3、设置对应的kSecAttr属性,用来指明我需要对哪个Keychain item进行操作。
4、调用IOS中的增删改查函数,传入字典查询条件,并获得对应的结果。(我们当然可以指定我们需要什么返回结果,是BOOL值,还是一组属性或data值)

kSecAttr——唯一标识Keychain item的关键

每个Keychain item都是用了一组属性来唯一的描述,当我们需要对Keychian item进行操作时,也是通过这组属性来定位的。同时,对于重要的要加密的信息,IOS也是通过几个关键属性来对应生成私钥进行加解密的。对于每个class的关键属性,国外的牛人有如下记录:

    For a keychain item of class kSecClassGenericPassword, the primary key is the combination of kSecAttrAccount and kSecAttrService.For a keychain item of class kSecClassInternetPassword, the primary key is the combination of kSecAttrAccount, kSecAttrSecurityDomain, kSecAttrServer, kSecAttrProtocol, kSecAttrAuthenticationType, kSecAttrPort and kSecAttrPath.For a keychain item of class kSecClassCertificate, the primary key is the combination of kSecAttrCertificateType, kSecAttrIssuer and kSecAttrSerialNumber.For a keychain item of class kSecClassKey, the primary key is the combination of kSecAttrApplicationLabel, kSecAttrApplicationTag, kSecAttrKeyType, kSecAttrKeySizeInBits, kSecAttrEffectiveKeySize, and the creator, start date and end date which are not exposed by SecItem yet.For a keychain item of class kSecClassIdentity I haven't found info on the primary key fields in the open source files, but as an identity is the combination of a private key and a certificate, I assume the primary key is the combination of the primary key fields for kSecClassKey and kSecClassCertificate.As each keychain item belongs to a keychain access group, it feels like the keychain access group (field kSecAttrAccessGroup) is an added field to all these primary keys.

参考资料

http://my.oschina.net/w11h22j33/blog/206713

http://stackoverflow.com/questions/11614047/what-makes-a-keychain-item-unique-in-ios

https://www.andyibanez.com/using-ios-keychain/

https://developer.apple.com/library/mac/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html

http://hayageek.com/ios-keychain-tutorial/

这篇关于IOS安全编程之Keychain基本概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140527

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念