Ios 获取加密格式的密钥链密码

Ios 获取加密格式的密钥链密码,ios,cocoa-touch,encryption,keychain,security-framework,Ios,Cocoa Touch,Encryption,Keychain,Security Framework,我正在开发一款iOS应用程序,它使用Keychain、Security.framework和苹果的KeychainWrapper类在我的应用程序中安全地存储用户密码 该应用程序允许用户创建帐户。当用户创建帐户时,应用程序需要将用户密码的加密版本发送到我的服务器(POST请求) 这一切都是可行的,但我面临的问题是,我可以安全地存储数据并检索数据,但我不知道如何检索数据的加密版本 换句话说,假设用户创建了一个帐户,并将其密码设置为“hello”。然后我将应用程序设置为安全地将其存储在钥匙链中 然后i

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

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

这一切都是可行的,但我面临的问题是,我可以安全地存储数据并检索数据,但我不知道如何检索数据的加密版本

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

然后iOS对其进行加密并将其存储在钥匙链中。为了回答这个问题,让我们假设加密版本是“h235llo”

现在,当我想向服务器发送密码时,我不想发送“hello”。我想发送“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];
为了从钥匙链中安全地检索用户名/密码,我正在执行以下操作:

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];
在这件事上的任何帮助都将不胜感激


谢谢您的时间,丹。

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


您将向服务器请求该用户的SALT。

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


您将向服务器请求该用户的SALT。

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


您将向服务器请求该用户的SALT。

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


您可能会向服务器请求该用户的SALT。

密钥链的内部加密详细信息是私有的,可能会更改。(它们并不完全是私有的。苹果公司提供了一个服务,但应用程序无法访问具体细节。)

我怀疑您对加密(以某种方式对数据进行了加扰,以便以后可以检索原始数据)和哈希(以某种方式对数据进行加扰,从而导致原始数据丢失)之间的区别有些困惑。密码身份验证通常使用散列,而不是加密

您需要的特定类型的散列(或加密)完全取决于您的服务器。您的服务器不可能依赖特定设备上iOS密钥链的内部加密状态(如果可以,您也不希望这样)。所以问题是,您的服务器希望身份验证请求采用什么格式


如果您控制服务器,并且您正在寻找一种不发送明文密码的好方法进行身份验证,那么恭喜您,您考虑得很好。但是,您需要的工具不是加密。它是一个像PBKDF2一样的关键派生函数。你可以从第16分钟开始在这里找到一个介绍。或者您可以从开始。

密钥链的内部加密详细信息是私有的,可能会更改。(它们并不完全是私有的。苹果公司提供了一个服务,但应用程序无法访问具体细节。)

我怀疑您对加密(以某种方式对数据进行了加扰,以便以后可以检索原始数据)和哈希(以某种方式对数据进行加扰,从而导致原始数据丢失)之间的区别有些困惑。密码身份验证通常使用散列,而不是加密

您需要的特定类型的散列(或加密)完全取决于您的服务器。您的服务器不可能依赖特定设备上iOS密钥链的内部加密状态(如果可以,您也不希望这样)。所以问题是,您的服务器希望身份验证请求采用什么格式


如果您控制服务器,并且您正在寻找一种不发送明文密码的好方法进行身份验证,那么恭喜您,您考虑得很好。但是,您需要的工具不是加密。它是一个像PBKDF2一样的关键派生函数。你可以从第16分钟开始在这里找到一个介绍。或者您可以从开始。

密钥链的内部加密详细信息是私有的,可能会更改。(它们并不完全是私有的。苹果公司提供了一个服务,但应用程序无法访问具体细节。)

我怀疑您对加密(以某种方式对数据进行了加扰,以便以后可以检索原始数据)和哈希(以某种方式对数据进行加扰,从而导致原始数据丢失)之间的区别有些困惑。密码身份验证通常使用散列,而不是加密

您需要的特定类型的散列(或加密)完全取决于您的服务器。您的服务器不可能依赖特定设备上iOS密钥链的内部加密状态(如果可以,您也不希望这样)。所以问题是,您的服务器希望身份验证请求采用什么格式


如果您控制服务器,并且您正在寻找一种不发送明文密码的好方法进行身份验证,那么恭喜您,您考虑得很好。但是,您需要的工具不是加密。它是一个像PBKDF2一样的关键派生函数。你可以从第16分钟开始在这里找到一个介绍。或者您可以从开始。

密钥链的内部加密详细信息是私有的,可能会更改。(它们并不完全是私有的。苹果公司提供了一个服务,但应用程序无法访问具体细节。)

我怀疑您对加密(在suc中被置乱的数据)之间的区别有些困惑