Strongbox
Strongbox是一个用于在密钥链中安全存储数据的Swift实用类。使用它来安全地存储小块敏感数据。
Strongbox基于Lockbox v3,一个等价的Objective-C实现。
概述
有些数据敏感,应用有时需要存储
- 用户名
- 密码
- 应用内购买解锁功能位
- 以及其他任何如果落入错误之手就会变得糟糕的数据。
要意识到的是,存储在NSUserDefaults
中的数据是明文存储的!更进一步地说,您的应用沙盒中存储的大部分内容也都是明文存储的。
令人惊讶的是,新和经验丰富的应用开发者常常没有意识到这一点,直到为时已晚。
Strongbox使将任何符合NSSecureCoding
的Foundation对象存储到密钥链并从中检索变得容易。您可以避免直接处理密钥链API!
为了提高安全性,并避免可能的应用之间(包括您和其他开发者)存储的数据之间的冲突,您在类方法中提供用于存储和检索数据的密钥之前 Added 您的app的包标识符。您可以通过调用接受选择的包装前缀的替代init()
方法来覆盖此行为。
需要注意的一个制度是,密钥链确实不是为了存储大量数据而设计的,所以不要仅仅因为想让它安全就试图用这些API存储大量数据。在这种情况下,请考虑替代加密技术。
方法
Strongbox 包含以下方法
通用对象存储和检索
archive(_ object: Any?, key: String) -> Bool
archive(_ object: Any?, key: String, accessibility: CFString) -> Bool
unarchive(objectForKey: String) -> Any?
remove(key: String) -> Bool
这些方法分别使用 NSKeyedArchiver
和 NSKeyedUnarchiver
对象进行编码和解码。您的对象必须符合 NSSecureCoding
。
方法 archive
返回 Bool
值,指示密钥链操作成功还是失败。方法 unarchive
返回一个可选值,如果操作成功,可以展开。返回值是类型 Any?
,您需要将其展开并适当转换为已知的类型。例如
let sb = Strongbox()
sb.archive("String", key: "MyKey") // true
let myString = sb.unarchive(objectForKey: "MyKey") as! String
方法 remove
是移除之前存储值的一种方便且直观的机制。
稍微简单一些
var myArray: Array[String] = ...
let sb = Strongbox()
sb.archive(myArray, key: "MyArrayKey") // true
...
if let savedArray = sb.unarchive(objectForKey: "MyArrayKey") as? Array<String> {
...
}
带有 accessibility
参数的方法需要一个 密钥项可访问性常量。您可以用来控制密钥项何时可读。例如,传递 kSecAttrAccessibleWhenUnlockedThisDeviceOnly
将使其仅在设备解锁时可用,且不会将该条目迁移到新设备或安装中。没有特定 accessibility
参数的方法将使用默认值 kSecAttrAccessibleWhenUnlocked
,这是最近 iOS 版本的默认设置。
要求和限制
要使用此类,您需要将 Security
框架添加到项目中。
您的项目必须启用密钥链共享,以便 Lockbox 能够访问密钥链,但您可以移除 Xcode 添加的任何密钥链组。显然,此权限对密钥链访问是必需的,而不仅仅是共享。
此类是为在 Cocoa Touch 和 iOS 下使用而编写的。代码和测试在 Mac OS 下的 iOS 模拟器中运行良好。但是在 Cocoa 和 Mac OS 下使用此类时存在一些问题。两个平台之间存在一些关键链 API 的差异。您可以随意将此存储库分支出来,使其同时适用于 Cocoa 和 Cocoa Touch,我将乐意考虑您的拉取请求!
设备上运行单元测试的注意事项
如果在您的应用单元测试在设备上运行时遇到Strongbox方法SecItemCopyMatching错误代码-34018,您可以通过对单元测试的.xcttest文件夹进行代码签名来避免这些错误。
向您的单元测试目标的构建阶段添加运行脚本阶段
codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"
安装
Strongbox可以通过CocoaPods或Carthage获得。
CocoaPods
安装时,只需将以下行添加到您的Podfile中
pod "Strongbox"
然后,从Terminal中运行pod install
Carthage
安装时,只需将以下行添加到您的Cartfile中
github "granoff/Strongbox"
然后,运行carthage update
来构建框架,并按照Carthage的说明将框架添加到您的项目中。
作者
Mark H. Granoff, [email protected]
许可协议
Strongbox受MIT许可证许可。请参阅LICENSE文件获取更多信息。