以加密格式获取Keychain密码

时间:2015-02-26 21:46:54

标签: ios cocoa-touch encryption keychain security-framework

我正在开发一款iOS应用程序,它使用Keychain,Security.framework和Apple的KeychainWrapper类在我的应用程序中安全地存储用户密码。

该应用允许用户创建帐户。当用户创建帐户时,应用程序需要将加密版本的用户密码发送到我的服务器(POST请求)。

这一切都有效,但我遇到的问题是我可以安全地存储数据并检索它,但我不知道如何检索我的数据的加密版本。

换句话说,假设用户创建了一个帐户,他们将密码设置为" hello"。然后我将应用程序设置为将其安全地存储在钥匙串中。

然后iOS加密它并将其存储在钥匙串中。为了这个问题,我们假装加密版本是" h235llo"。

现在,当我想将密码发送到我的服务器时,我不想发送"你好"。我想发送" h235llo" (加密的字符串)。如何访问加密字符串?

以下是我用来访问Keychain的代码:

为了安全地存储用户名/密码到钥匙串,我这样做:

KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserLoginData" accessGroup:nil];
[keychain setObject:_username.text forKey:(__bridge id)kSecAttrAccount];
[keychain setObject:_password.text forKey:(__bridge id)kSecValueData];

为了安全地从钥匙串中检索用户名/密码,我这样做:

NSString *secureUser = [keychain objectForKey:(__bridge id)kSecAttrAccount];
NSString *securePass = [keychain objectForKey:(__bridge id)kSecValueData];

非常感谢任何有关此事的帮助。

谢谢你的时间,Dan。

2 个答案:

答案 0 :(得分:2)

Keychain的内部加密详细信息是私有的,可能会发生变化。 (他们完全私有.Apple会pretty nice job of explaining them,但应用无法访问具体细节。)

我怀疑你对加密之间存在一些混淆(加密数据的方式可能会在以后检索到原始文件),以及散列(数据已经被打乱,原来丢失了)。密码验证通常使用散列,而不是加密。

您需要的特定类型的哈希(或加密)完全取决于您的服务器。您的服务器无法依赖特定设备上iOS Keychain的内部加密状态(如果可能,您也不会想要)。所以问题是,您的服务器期望身份验证请求采用何种格式。

如果您控制服务器,而您只是在寻找一种不通过发送明文密码进行身份验证的好方法,那么祝贺,您就会考虑这个问题。但是,您想要的工具不是加密。它是像PBKDF2这样的关键衍生函数。您可以从第16分钟开始在此Renaissance.io talk中找到介绍。或者您可以从slide 33开始。

答案 1 :(得分:1)

您需要生成密码的单向HASH。这就是您存储和发送到服务器的内容。

您会向服务器询问该用户的SALT。