2013-02-15 62 views
6

我有一个关于核心数据加密的问题。我将一些敏感的用户数据存储在Core Data SQLite数据库中。临界值都是可变换的,我正在使用AES256对它们进行加密和解密,包括每个值的个人IV。加密密钥是用户选择的密码的SHA512散列。迄今为止这工作得很好。核心数据加密

现在关于用户密码。当用户启动应用程序时,他被要求输入密码。密码正在使用SHA512散列并存储在iOS钥匙串中。对于每个写入或读取操作,NSValueTransformer将从钥匙串中获取密码。如果应用程序正在关闭,我将从密钥链中删除密码哈希。

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

现在我的实际问题:你认为这是一个好的加密方法吗?如果输入的密码正确,你还会测试其他什么?

我有点担心,在应用程序运行时将密码哈希存储在钥匙串中会让所有事情变得更慢,因为NSValueTransformer必须始终访问钥匙串。将密码散列保存在内存中是否足够安全,所以在应用程序关闭时它会被删除?

回答

7

你不应该使用密码的散列,散列被设计得很快,所以它(相对)很容易做一个暴力攻击。使用key derivation function,如PBKDF2

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

我不太确定将哈希存储在钥匙串中,而不是将其保存在内存中。上次我研究这一点时,解密钥匙链是比较容易的。而且每个可以读取正在运行的应用程序的内存的攻击者很可能会窥探钥匙串访问或解密的数据。只要将它保存在内存中,并确保在应用程序挂起到背景等时擦除内存。对于每个解密数据,这显然也是正确的。

[编辑:@JeffLockhart澄清一个主加密密钥的程序] 你生成一个随机密钥对数据进行加密,让我们称之为关键答:您可以使用SecRandomCopyBytes生成密钥A,看到Apple's CryptoExcercise针对使用例。您使用密钥A来加密用户数据。要保存密钥A,必须使用第二个密钥B加密密钥A.由于快速暴力或字典攻击,您不应直接将密码用作密钥B.所以你从一个PBKDF的密码派生出一个密钥,就像在this stackoverflow的答案。然后你用密钥B加密密钥A,例如使用CCCrypt。您保存加密密钥A和用于派生密钥B的盐。 要解密,用户输入密码,您使用密码和salt来派生密钥B.您使用派生的密钥B解密密钥A.希望澄清。

+0

你能说明你的意思吗?“使用随密钥加密的随机生成的加密密钥和基于密码的密钥加密密钥?”我正在寻找加密我的核心数据存储的一些字段,并且正在寻找一个生成用于执行加密的密钥的最佳实践。我同意以密码为基础是没有道理的,因为它可以改变。 – 2013-04-23 05:35:41

1

你可以看看这个:

Secure Incremental Store

他们实现其使用加密的SQLite数据库内一个NSIncrementalStore子类。这是Apple SQLite Store的替代品。还带有价格标签。

+1

“带有价格标签” - 你不是在开玩笑! – kball 2013-05-03 19:35:12