Ios 我们如何以加密格式在密钥链中存储用户名密码组合

Ios 我们如何以加密格式在密钥链中存储用户名密码组合,ios,objective-c,keychain,offlineapps,Ios,Objective C,Keychain,Offlineapps,我需要在我的应用程序中实现脱机登录。目前我在keychain中存储密码,这些密码在应用程序联机时至少用于登录一次。但现在我没有检查用户名-密码组合。如果一台设备有多个用户,仅存储密码是不够的。所以,你们中的任何人都可以提出一些不存在安全漏洞的建议。根据这一点,你们可以使用NSURLCredential 商店 NSURLCredential *credential; credential = [NSURLCredential credentialWithUser:username passwor

我需要在我的应用程序中实现脱机登录。目前我在keychain中存储密码,这些密码在应用程序联机时至少用于登录一次。但现在我没有检查用户名-密码组合。如果一台设备有多个用户,仅存储密码是不够的。所以,你们中的任何人都可以提出一些不存在安全漏洞的建议。

根据这一点,你们可以使用NSURLCredential

商店

NSURLCredential *credential;

credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
获取存储数据

NSURLCredential *credential;
NSDictionary *credentials;

credentials = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:self.loginProtectionSpace];
credential = [credentials.objectEnumerator nextObject];
NSLog(@"User %@ already connected with password %@", credential.user, credential.password);

您可以将其保存在用于保存敏感信息的设备密钥链中。从这里下载一个包装器,并用sha512加密密码

#import "KeychainWrapper.h"
#include <CommonCrypto/CommonDigest.h>

-(void)createSHA512andSaveToKeychain:(NSString*)unencryptedPasswd {
    const char *passwdBytes= [unencryptedPasswd cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *passwordData = [NSData dataWithBytes:passwdBytes length:unencryptedPasswd.length];
    uint8_t digest[CC_SHA512_DIGEST_LENGTH];
    CC_SHA512(passwordData.bytes, passwordData.length, digest);
    NSMutableString *encryptedPasswd= [NSMutableString  stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++) {
        [encryptedPasswd appendFormat:@"%02x", digest[i]];
    }

    // Save the password in the device keychain
    KeychainWrapper *keychainWrapper = [[KeychainWrapper alloc] init];
    [keychainWrapper mySetObject:encryptedPasswd forKey:(__bridge id)kSecValueData];
    [keychainWrapper writeToKeychain];
}

我建议您使用登录名作为密钥来存储密码。类似于:
acccount_test@test.com/password


您可以对密码的
md5
值进行编码以提高安全性

您想记住所有用户还是最后一个用户?@bobby:需要记住所有用户我建议您存储密码,使用登录名作为密钥。比如:account_test@test.com/密码。您可以对密码的md5值进行编码以提高安全性too@bobby:谢谢你的回复,鲍比。让我试试。我确实加了它作为答案。你能投票并把它作为选择答案吗?我们能将检索到的密码与正确的用户名匹配吗?同一设备有多个用户是。如果您需要存储多个密码(和用户名),则需要使用不同于Apple的包装器。请参阅此链接:基本上,您使用“initWithIdentifier:”方法使用用户特定的初始值设定项初始化keychain类。
// Retrieve the pwd from the device keychain
KeychainWrapper *keychainWrapper = [[KeychainWrapper alloc] init];
NSString *pwd = [keychainWrapper myObjectForKey:@"v_Data"];