Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.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
我应该使用哪个密钥在iOS密钥链中存储密码?_Ios_Keychain - Fatal编程技术网

我应该使用哪个密钥在iOS密钥链中存储密码?

我应该使用哪个密钥在iOS密钥链中存储密码?,ios,keychain,Ios,Keychain,Apple GenericKeychain示例中的KeychainItemWrapper类使用kSecValueData密钥存储密码 但是参考文献 说kSecValueData是 在结果字典中用于SecItemCopyMatching或SecItemAdd,指示返回值的类型 调用SecItemAdd创建密钥链项目时应使用哪个密钥?您应使用kSecValue数据作为密钥来存储密码(NSData或CFDataRef格式) 本主题中的参考有点不清楚,kSecValueData键既可用作输出键,也可用作

Apple GenericKeychain示例中的KeychainItemWrapper类使用kSecValueData密钥存储密码

但是参考文献

说kSecValueData是 在结果字典中用于SecItemCopyMatching或SecItemAdd,指示返回值的类型


调用SecItemAdd创建密钥链项目时应使用哪个密钥?

您应使用kSecValue数据作为密钥来存储密码(NSData或CFDataRef格式)

本主题中的参考有点不清楚,kSecValueData键既可用作输出键,也可用作输入键。也就是说,当您查询一个keychain项(SecItemCopyMatching)并指定一个kSecReturnAttributes键时使用它,因此结果作为字典返回,密码将存储在该字典的kSecValueData键下。在向密钥链(SecItemAdd)添加项时也可以使用它,在调用该方法之前,将密码的NSData或CFDataRef值存储在kSecValueData键中

以下是两种情况的示例:

检索密码:

NSMutableDictionary *queryDictionary = [[NSMutableDictionary alloc] init];
[queryDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass];
[queryDictionary setObject:service forKey:kSecAttrService];
[queryDictionary setObject:account forKey:kSecAttrAccount];
// The result will be a dictionary containing the password attributes...
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnAttributes)];
// ...one of those attributes will be a kSecValueData with the password
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnData)];
OSStatus sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryDictionary), (CFTypeRef *)&result);
if (sanityCheck != noErr)
{
    NSDictionary * resultDict = (__bridge NSDictionary *)result;
    // here's the queried password value
    NSData *passwordValue = [resultDict objectForKey:(__bridge id)(kSecValueData)];
}
NSString *passwordString = @"my password value";
NSData *passwordData = [passwordString dataUsingEncoding:NSUTF8StringEncoding];
CFDictionaryRef result = nil;
NSMutableDictionary *addDictionary = [[NSMutableDictionary alloc] init];
[addDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass];
[addDictionary setObject:service forKey:kSecAttrService];
[addDictionary setObject:account forKey:kSecAttrAccount];

// here goes the password value
[addDictionary setObject:passwordData forKey:(__bridge id<NSCopying>)(kSecValueData)];

OSStatus sanityCheck = SecItemAdd((__bridge CFDictionaryRef)(queryDictionary), NULL)
if (sanityCheck != noErr)
{
   // if no error the password got successfully stored in the keychain
}
NSMutableDictionary*queryDictionary=[[NSMutableDictionary alloc]init];
[queryDictionary setObject:(_桥id)kSecClassGenericPassword forKey:(_桥id)kSecClass];
[queryDictionary设置对象:服务forKey:kSecAttrService];
[queryDictionary setObject:account forKey:kSecAttrAccount];
//结果将是一个包含密码属性的字典。。。
[queryDictionary setObject:YES forKey:(u桥id)(kSecReturnAttributes)];
//…其中一个属性将是带有密码的kSecValueData
[queryDictionary setObject:YES forKey:(u桥id)(kSecReturnData)];
OSStatus sanityCheck=SecItemCopyMatching((uu桥CFDictionaryRef)(查询字典),(CFTypeRef*)和结果);
如果(sanityCheck!=noErr)
{
NSDictionary*ResultDisct=(\u桥NSDictionary*)结果;
//这是查询到的密码值
NSData*passwordValue=[ResultDisct objectForKey:(u桥id)(kSecValueData)];
}
添加密码:

NSMutableDictionary *queryDictionary = [[NSMutableDictionary alloc] init];
[queryDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass];
[queryDictionary setObject:service forKey:kSecAttrService];
[queryDictionary setObject:account forKey:kSecAttrAccount];
// The result will be a dictionary containing the password attributes...
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnAttributes)];
// ...one of those attributes will be a kSecValueData with the password
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnData)];
OSStatus sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryDictionary), (CFTypeRef *)&result);
if (sanityCheck != noErr)
{
    NSDictionary * resultDict = (__bridge NSDictionary *)result;
    // here's the queried password value
    NSData *passwordValue = [resultDict objectForKey:(__bridge id)(kSecValueData)];
}
NSString *passwordString = @"my password value";
NSData *passwordData = [passwordString dataUsingEncoding:NSUTF8StringEncoding];
CFDictionaryRef result = nil;
NSMutableDictionary *addDictionary = [[NSMutableDictionary alloc] init];
[addDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass];
[addDictionary setObject:service forKey:kSecAttrService];
[addDictionary setObject:account forKey:kSecAttrAccount];

// here goes the password value
[addDictionary setObject:passwordData forKey:(__bridge id<NSCopying>)(kSecValueData)];

OSStatus sanityCheck = SecItemAdd((__bridge CFDictionaryRef)(queryDictionary), NULL)
if (sanityCheck != noErr)
{
   // if no error the password got successfully stored in the keychain
}
NSString*passwordString=@“我的密码值”;
NSData*passwordData=[passwordString数据使用编码:NSUTF8StringEncoding];
cfyref结果=零;
NSMutableDictionary*addDictionary=[[NSMutableDictionary alloc]init];
[addDictionary setObject:(uu桥id)kSecClassGenericPassword forKey:(uu桥id)kSecClass];
[addDictionary设置对象:服务forKey:kSecAttrService];
[addDictionary setObject:account forKey:kSecAttrAccount];
//下面是密码值
[addDictionary setObject:passwordData forKey:(u桥id)(kSecValueData)];
OSStatus sanityCheck=SecItemAdd((uu桥CFDictionaryRef)(queryDictionary),NULL)
如果(sanityCheck!=noErr)
{
//如果没有错误,密码将成功存储在钥匙链中
}

更好的代码,更少的bug,这里: