我正在开发一款iOS应用程序,该应用程序使用Keychain、Security.framework和Apple的KeychainWrapper类将用户密码安全存储在我的应用程序中。
该应用程序允许用户创建帐户。当用户创建帐户时,应用程序需要将用户密码的加密版本发送到我的服务器(POST请求)。
这一切都有效,但我遇到的问题是,我可以安全地存储数据并检索它,但我不知道如何检索加密版本的数据。
换句话说,假设用户创建了一个帐户,并将密码设置为"你好"。然后,我将应用程序设置为将其安全地存储在钥匙链中。
因此,iOS会对其进行加密并将其存储在密钥链中。为了这个问题,让我们假设加密版本是"h235llo"。
现在,当我想把密码发送到我的服务器时,我不想发送"你好"。我想发送"h235llo"(加密字符串)。如何访问加密字符串?
这是我用来访问钥匙链的代码:
为了安全地将用户名/密码存储到钥匙链中,我正在这样做:
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];
如果能在这件事上提供任何帮助,我们将不胜感激。
谢谢你抽出时间,丹。
Keychain的内部加密细节是私有的,可能会更改。(它们并不是完全私有的。苹果在解释它们方面做得很好,但应用程序无法访问具体细节。)
我怀疑你对加密(以稍后可以检索到原始数据的方式对数据进行加密)和哈希(以丢失原始数据的形式对数据进行了加密)之间的区别有些困惑。密码身份验证通常使用哈希,而不是加密。
您需要的特定类型的哈希(或加密)完全取决于您的服务器。你的服务器不可能依赖特定设备上iOS钥匙链的内部加密状态(如果可以的话,你也不想这样做)。所以问题是,您的服务器希望身份验证请求采用什么格式
如果你控制了服务器,并且你只是在寻找一种不发送明文密码的好方法来进行身份验证,那么祝贺,你考虑得很好。但是,您需要的工具不是加密。这是一个类似于PBKDF2的密钥派生函数。你可以在Renaissance.io从第16分钟开始的演讲中找到介绍。或者您可以从幻灯片33开始。
您需要生成密码的单向HASH。这就是您存储并发送到服务器的内容。
您会向服务器请求该用户的SALT。