核心数据加密

2023-11-26

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

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

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

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

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


您不应该使用密码的哈希值,哈希值设计得很快,因此(相对)很容易进行暴力攻击。用一个密钥导出函数 like PBKDF2.

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

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

[编辑:@JeffLockhart 澄清主加密密钥的程序] 你生成一个随机密钥来加密你的数据,我们称之为密钥 A。你可以使用Sec随机复制字节要生成密钥 A,请参阅苹果的加密练习获取使用示例。您使用密钥 A 来加密用户数据。要保存密钥 A,您必须使用第二个密钥 B 来加密密钥 A。您不应该直接使用密码作为密钥 B,因为这会导致快速暴力破解或字典攻击。因此,您可以使用 PBKDF 从密码中派生出密钥,如下所示this堆栈溢出答案。然后用密钥 B 加密密钥 A,例如使用CCCrypt。您保存加密的密钥 A 和用于派生密钥 B 的盐。 要解密,用户输入密码,您使用密码和盐导出密钥 B。您使用派生密钥 B 解密密钥 A。希望能澄清这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核心数据加密 的相关文章

随机推荐