c++ - 无法成功调用 SecItemAdd
问题描述
我正在尝试通过 C++ API 在 macOS 中的钥匙串中添加一个简单的字符串密码。不幸的是,我无法SecItemAdd
接到上班的电话。我知道这是因为我的kSecValueRef
键值是错误的类型,但到目前为止,Google/ Apple 文档/现有的 StackOverflow 问题尚未向我揭示我应该使用什么类型,以及如何创建它。这是我到目前为止所拥有的:
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 文档中看到它说:
对应的值取决于所请求的项目类,其类型为 SecKeychainItem、SecKey、SecCertificate 或 SecIdentity。
但是我没有,SecKeychainItem
因为我还没有添加该项目,而且其他类型似乎不适用于普通字符串。
想法?
解决方案
弄清楚了!对于简单的数据,例如字符串,您应该使用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" );
推荐阅读
- excel - 在列而不是行中显示 SPARQL 输出
- javascript - 将音频 isPlaying 状态设置为当前音频唯一
- flutter - Flutter如何嵌入日期选择器
- blockchain - 如何在以太坊平台上处理 Solidity 中的 REST API 响应?
- c++ - C ++两个模板,相同的名称,相同的签名,不同的类:如何强制编译器使用预期的一个?
- django - 将参数传递给 Django 中的 cursor.execute
- java - 如何编写用于构建弹性搜索查询的 java 单元测试?
- php - Symfony 如何在 url 中传递多对多关系的第一个值?
- javascript - 多个选择的一个事件处理程序
- julia - 如何在 Julia 中将字节转换为浮点/双精度