Strongbox 0.6.1

Strongbox 0.6.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2021年7月
SPM支持SPM

Mark H. Granoff维护。



Strongbox 0.6.1

Strongbox

CI Status Version License Platform

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

这些方法分别使用 NSKeyedArchiverNSKeyedUnarchiver 对象进行编码和解码。您的对象必须符合 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文件获取更多信息。