使用Keychain固有地不安全(当收回物品时?)

时间:2012-02-27 23:15:14

标签: cocoa security

SecOps人免责声明:我是这个东西的知情业余爱好者。我有可能误解了一些事情。如果是这样,请告知:)

我正在使用我的应用中的Keychain / KeychainItemWrapper进行一些工作。我希望以安全的方式存储用户的密码,而Keychain似乎就是这样做的。

然而,我有点困惑。我认为基本的密码安全性(以unix crypt()为模型)是这样的:

  1. 使用加密算法加密并存储用户指定的密码,每次都会给出相同的结果(给定相同的盐)
  2. 以后,当用户输入密码时,也要加密
  3. 比较两个加密字符串。他们是平等的吗?密码必须相同
  4. 然而,似乎使用KeychainItemWrapper(也许是整个Keychain API?)意味着将密码作为纯文本提供给程序。但是,这不是没有安全感吗?未加密的密码只是在内存中等待有人阅读,对吗?

    问题:在Keychain中存储密码的最佳模式是什么,考虑到我对安全性的担忧以及我的程序实际上并不需要知道加密值这一事实?或者我的恐惧没有根据,我应该停止担心并学会爱上钥匙扣给我的(未加密的)密码?

1 个答案:

答案 0 :(得分:3)

你混淆了两个概念(哈希与加密)。

当您需要验证某人是否知道密码时,您将其哈希(带有盐)并存储该哈希值。然后,当有人尝试以该用户身份进行身份验证时,您要求他们输入密码,使用相同的盐对其进行哈希处理,然后与存储的值进行比较。这是理想的,因为散列是单向/不可逆的功能。因此,如果有人访问您的凭据存储,他们就不会获得任何东西,因为他们需要破解该哈希(而现代算法如crypt / bcrypt专门用于使暴力破解非常困难)。

但是,如果您需要能够实际恢复明文密码,则会加密密码而不是对其进行哈希处理。与加密哈希不同,假设您知道密钥,加密是可逆的。

Keychain会加密您存储在其中的任何内容,并假设您需要在某个时刻恢复实际数据(例如,如果我将我的Facebook密码放入钥匙串,它就能够解密并提供实际密码,当我需要用它来访问Facebook时)。 Keychain旨在存储加密的秘密值,以便在您需要实际恢复原始值时。