转载

有关Keychain服务,你需要了解这些

本文为投稿文章,原文

在iOS系统中,Keychain提供了安全的存储服务,用来存储一些敏感信息。但是在日常开发中,我们经常会忽视这个苹果自荐的功能,本文的目的就是引起开发者的重视,敏感信息尽量使用Keychain服务。

NSUserDefaults不安全

NSUserDefaults其实是plist文件中键值存储,并且最大的问题是存在与沙盒中,这就对安全性埋下了隐患。如果攻击者破解app,拿到了沙盒中的数据,就会造成数据泄漏,后果不堪设想。

当然,一般也不会有把密码直接使用NSUserDefaults存储的,都会进行加密、或者是多重加密后再进行NSUserDefaults存储。这么做其实是可行的,前提是加密算法不能泄漏。有个小问题就是,如果用户删掉app重装的话,之前所有存储的敏感信息都会消失。比如,一个用户误删了使用NSUserDefaults存储密码的app,当重新安装之后,由于以前是记住密码免登录,只因为自己操作不当,接下来要进入找回密码功能,重新修改密码才能再次使用app。这对用户来说是一种相当不友好的体验。

所以,正确的姿势是使用Keychain服务来存储。Keychain保存的数据不仅仅是加密过的,而且由于Keychain是存在与沙盒之外的,当应用删除之后,app存储的数据并没有被删掉,第二次安装时只要读取Keychain里的数据,即可得到以前存储的信息。

Keychain使用场景

  • 存储隐私信息

在iOS系统中,最常用的keychain服务就是存储用户密码了。使用keychain保存用户密码最大的好处已经在上面说过,个人极力推荐这么做。

  • 数据共享

如果我们有多个app,它们之间需要共享一些数据,以提供更好的用户体验,那么使用Keychain群组可以实现。但前提是同一个公司的产品才能共享,比如com.hyyy.test1和com.hyyy.test2两个同一公司下的不同产品之前可以实现数据共享。

  • 设备唯一标示存储

在iOS中,为了在苹果的打压下获取唯一标示符,开发者们也是想尽了办法,目前最好的方式就是获取IDFV,并将其存储到keychain中。IDFV是设备区别应用提供商的,一般来说可以作为应用唯一标示符。但是IDFV缺陷就是当设备删除了该所有应用提供商的app之后,IDFV值会发生变化,所以IDFV+Keychain的组合目前被经常用到,来替代UDID的作用。特别是加上Keychain的共享服务,可以使应用提供商下的所有app下获取的IDFV都不会发生变化。这一服务可以说是目前最佳的识别用户的办法。

  • 其他用处

当然,不同app的需求是不一样的,如果你需要存储一些信息,即使app删掉后也不会丢失,那么使用Keychain服务可以完美地实现这点。

实践总结

其实,所有的这些都是本人摸索出来的,并且实现了一个Swift 3下的简单Keychain工具,叫HYKeychainHelper。这个框架是参考大名鼎鼎的SAMKeychain和苹果官方的GenericKeychain实现的,如果您的Swfit项目需要使用到Keychain,希望这个可以帮到您,HYKeychainHelper操作起来也比较简单,如果您之前使用过SAMKeychain的话,那更容易了。

HYKeychainHelper的用法也比较简单,为了更好上手,语法采用和SAMKeychain基本一致。具体如下:

/// query account's password

HYKeychainHelper.password(service: "your_service_name", account: "your_account_name")

/// add or update an account

HYKeychainHelper.set(password: "your_password", service: "your_service_name", account: "your_account_name")

/// delete an account

HYKeychainHelper.deletePassword(service: "your_service_name", account: "your_account_name")

/// all accounts

HYKeychainHelper.allAccounts(forService: "your_service_name")

对于更多的用法,请查看HYKeychainHelper获取更多细节。

另外,对Keychain的了解难免有些遗漏,如果对Keychain有更多的看法,欢迎留言给我,对自己来说也是一种收获!

正文到此结束
Loading...