ios - 核心数据加密

标签 ios core-data encryption nsvaluetransformer

我有一个关于 Core Data 加密的问题。我将一些敏感的用户数据存储在 Core Data SQLite 数据库中。临界值都是可转换的,我正在使用 AES256“即时”加密和解密它们,包括每个值的单独 IV。加密 key 是用户选择的密码的 SHA512 散列。到目前为止,这非常有效。

现在关于用户密码。当用户启动应用程序时,系统会要求他输入密码。密码使用 SHA512 进行哈希处理并存储在 iOS 钥匙串(keychain)中。对于每个写入或读取操作,NSValueTransformer 将从钥匙串(keychain)中获取密码。如果应用程序正在关闭,我会从钥匙串(keychain)中删除密码哈希。

在我的 Core Data 数据库中,我有一个特殊的实体,它有一个随机数 != 0,因为它是唯一的值。为了测试用户是否输入了正确的密码,我获取了这个实体并读取了数字。如果是=! 0,我知道密码是正确的,因为当解密失败时,NSValueTransformer 总是返回 0。

现在我的实际问题是:您认为这是一种好的加密方法吗?您还会如何测试输入的密码是否正确?

我有点担心在应用程序运行时将密码哈希存储在钥匙串(keychain)中会使一切变慢,因为 NSValueTransformer 必须始终访问钥匙串(keychain)。仅将密码哈希保存在内存中是否足够安全,以便在应用关闭时将其删除?

最佳答案

您不应该使用密码的散列,散列的设计速度很快,因此(相对)很容易进行暴力攻击。使用key derivation function喜欢PBKDF2 .

不要使用直接从密码派生的 key 作为加密 key 。如果用户更改密码,则需要重新加密所有数据,备份变得毫无值(value)。使用随机生成的加密 key ,您使用基于密码的 key 加密 key 对其进行加密。

我不太确定将散列存储在钥匙串(keychain)中而不是将其保存在内存中。上次我研究这个时,解 key 匙串相对容易。每个可以读取您正在运行的应用程序内存的攻击者很可能能够窥探钥匙串(keychain)访问或解密数据。只需将其保存在内存中,并确保在应用挂起进入后台等情况下删除内存。这显然也适用于每条解密数据。

[编辑:@JeffLockhart 阐明主加密 key 的程序] 你生成一个随 secret 钥来加密你的数据,我们称之为 key A。你可以使用 SecRandomCopyBytes生成 key A,请参阅 Apple's CryptoExcercise一个用法示例。您使用 key A 来加密用户数据。要保存 key A,您必须使用第二个 key B 对 key A 进行加密。您不应该将密码直接用作 key B,因为快速暴力破解或字典攻击。因此,您可以使用 PBKDF 从密码中导出 key ,如 this 计算器答案。然后,您使用 key B 加密 key A,例如使用 CCCrypt .您保存加密 key A 和用于派生 key B 的盐。 要解密,用户输入密码,您使用密码和盐派生 key B。您使用派生 key B 解密 key A。希望澄清。

关于ios - 核心数据加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905135/

相关文章:

ios - 如何禁用按钮外的点击事件?

swift - 如何在核心数据中使用来自 NSArray 的动态多个 NSPredicate

swift - 在上下文之外创建 NSManagedObject

web-services - 使用公钥证书的 SoapUI Web 服务请求

php - 如何用BASH命令解密PHP Openssl加密

ios - 为什么通过在 TYPE UIView 上调用 .animate() 来触发动画

c# - MonoTouch File.ReadAllText 在内部 FileStream.Dispose() 上抛出异常

ios - 在uitableview中使用UIRefreshControl

ios - 从单元格内部删除数据

Drupal 7 密码哈希