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

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

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