SecureDefaults for iOS, macOS
要求 • 使用方法 • 安装 • 贡献 • 致谢 • 贡献 • 作者 • 许可证
SecureDefaults
是UserDefaults/NSUserDefaults
的包装,并额外添加了AES-256加密层(密钥长度为256位)。它包含
- AES-256加密
- PBKDF2密码拉伸
- 加密后哈希HMAC
- 密码盐
- 随机IV
AES算法所有密钥长度(即,128、192和256)的设计和强度足以保护机密级别的机密信息。绝密信息将需要使用192或256位密钥长度。保护国家安全系统和信息的产品中AES的实现必须在采购和使用之前由国家安全局审查和认证。[1]
动机
- 避免以下行为https://stackoverflow.com/questions/4747404/delete-keychain-items-when-an-app-is-uninstalled。(是的,仍然有一个密钥,但没有数据)
- 避免额外思考哪里是存储特定值的好地方。(在Keychain和
UserDefaults
之间进行选择) - 改进iOS平台上的安全性状况。我看到很多应用程序都没有使用
Keychain
。他们将所有敏感数据都存储在UserDefaults
中(访问令牌、密码等)... 至少,这可以帮助使这些应用程序更安全,而不会造成太多痛苦。也许,如果这个框架几乎和UserDefaults
一样,开发者们可能会开始使用它? - 将许多简单的密钥存储在
Keychain
中看起来并不是很好。
需求
- iOS 8.0+
- macOS 10.11+
- Xcode 10.1+
- Swift 4.2+
使用方法
使用 SecureDefaults
替代 UserDefaults/NSUserDefaults
非常简单。在大多数情况下,它与 UserDefaults
做的是同一事情。您只需要设置一个密码来使其工作。
替换以下代码
UserDefaults.standard
为以下代码
let defaults = SecureDefaults.shared
// Ensures that a password was not set before. Otherwise, if
// you set a password one more time, it will re-generate a key.
// That means that we lose old data as well.
if !defaults.isKeyCreated {
defaults.password = NSUUID().uuidString // Or any password you wish
}
以使用应用程序和密钥库组
let defaults = SecureDefaults(suitName: "app.group") // Set a shared app group
defaults.keychainAccessGroup = "keychain.group" // Set a shrared keychain group
if !defaults.isKeyCreated {
defaults.password = NSUUID().uuidString // Or any password you wish
}
由于 SecureDefaults
无法捕获任何特定的数据是否加密,因此要获取原始值,请使用以下方法
public func rawObject(forKey defaultName: String) -> Any?
安装
CocoaPods
SecureDefaults
可以通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 中
pod 'SecureDefaults', '1.0.7' # Swift 5.0
pod 'SecureDefaults', '1.0.0' # Swift 4.2
Carthage
将其添加到 Cartfile
中
github "vpeschenkov/SecureDefaults" == 1.0.7 # Swift 5.0
github "vpeschenkov/SecureDefaults" == 1.0.0 # Swift 4.2
$ carthage update
Swift Package Manager
创建一个 Package.swift
文件。
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "YourProject",
dependencies: [
.package(url: "https://github.com/vpeschenkov/SecureDefaults", "1.0.7")
],
targets: [
.target(name: "YourProject", dependencies: ["SecureDefaults"])
]
)
$ swift build
贡献
- 如果您需要帮助或想 提出一般问题,请创建一个问题。
- 如果您发现了一个 bug,请创建一个问题。
- 如果您有 功能请求,请创建一个问题。
- 如果您 想贡献力量,提交一个 pull request。
致谢
感谢以下人员
- Rob Napier - 为这篇出色的文章 "Properly Encrypting With AES With CommonCrypto"
- Håvard Fossli - 为这篇出色的 Gist "AES 256 in swift 4 with CommonCrypto"
作者
Victor Peschenkov, [email protected]
许可证
SecureDefaults
基于 MIT 许可证可用。查看 LICENSE 文件获取更多信息。