Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 使用钥匙链本身是否不安全(取回物品时?)_Cocoa_Security - Fatal编程技术网

Cocoa 使用钥匙链本身是否不安全(取回物品时?)

Cocoa 使用钥匙链本身是否不安全(取回物品时?),cocoa,security,Cocoa,Security,SecOps people免责声明:我是一个消息灵通的业余爱好者。我可能误解了什么。如果是,请告知:) 我正在我的应用程序中使用Keychain/KeychainItemWrapper进行一些工作。我想以一种安全的方式存储用户的密码,而钥匙链似乎就是这样做的 然而,我有点困惑。我认为基本密码安全性(仿照unixcrypt())是这样的: 加密并存储用户指定的密码,使用加密算法,每次都会给出相同的结果(给定相同的salt) 稍后,当用户输入密码时,也要对其进行加密 比较两个加密字符串。他们平等吗?

SecOps people免责声明:我是一个消息灵通的业余爱好者。我可能误解了什么。如果是,请告知:)

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

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

  • 加密并存储用户指定的密码,使用加密算法,每次都会给出相同的结果(给定相同的salt)
  • 稍后,当用户输入密码时,也要对其进行加密
  • 比较两个加密字符串。他们平等吗?密码必须相同
  • 然而,使用KeychainItemWrapper(可能还有整个KeyChainAPI?)似乎是为了将密码作为纯文本返回给程序。然而,这不是不安全吗?未加密的密码只是在内存中等待别人读取,对吗


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

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

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

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


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

    +1在不完全清楚的情况下重申:当有东西向您进行身份验证时,您只需要密码的散列。但是,当您对其他内容进行身份验证时,您需要实际的密码。密钥链中的大多数内容都允许您(程序)对其他内容(服务)进行身份验证,通常代表您的用户。