我正在尝试通过C ++ API在macOS中为它们的钥匙串添加一个简单的字符串秘密。不幸的是,我打不通SecItemAdd
的电话。我知道这是因为我对kSecValueRef
键的值是错误的类型,但是到目前为止Google / Apple docs / existing StackOverflow questions尚未向我透露我应该使用哪种类型,并且如何创建它。这是我到目前为止的内容:
CFStringRef keys[4];
keys[0] = kSecClass;
keys[1] = kSecValueRef;
keys[2] = kSecAttrAccount;
keys[3] = kSecAttrService;
CFTypeRef values[4];
values[0] = kSecClassGenericPassword;
values[1] = CFSTR("password");
values[2] = CFSTR( "account-1" );
values[3] = CFSTR( "service-1" );
CFDictionaryRef attributes = CFDictionaryCreate
(
( CFAllocatorRef )NULL,
( const void ** )keys,
( const void ** )values,
4,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks
);
CFShow(attributes);
OSStatus status = SecItemAdd(attributes, NULL);
那我该为kSecValueRef
投入些什么呢?我尝试对CFStringRef进行引用,但这没有用。我还在Apple docs中看到它说:
根据所请求的项目类别,相应的值为SecKeychainItem,SecKey,SecCertificate或SecIdentity。
但是我还没有SecKeychainItem
,因为我还没有添加项目,而其他类型似乎不适合普通字符串。
有想法吗?
答案 0 :(得分:0)
想通了!对于简单数据,例如字符串,应使用kSecValueData
键。这样一来,您只需传递CFStringRef
。
示例:
CFStringRef keys[4];
keys[0] = kSecClass;
keys[1] = kSecAttrAccount;
keys[2] = kSecAttrService;
keys[3] = kSecValueData;
CFTypeRef values[4];
values[0] = kSecClassGenericPassword;
values[1] = CFSTR( "account-15" );
values[2] = CFSTR( "service-126" );
values[3] = CFSTR( "password" );