我正在创建一个钥匙链,然后向其中添加了一个预定义的可信应用程序列表:
SecKeychainCreate([keychainPath UTF8String], (UInt32)strlen(keychainPass), keychainPass, FALSE, NULL, &someKeychain);
OSStatus someStatus = SecKeychainItemCreateFromContent(kSecGenericPasswordItemClass, &list, len, encryptedPass, someKeychain, accessRef, &someKeychainItem);
当我使用钥匙串访问应用程序打开新创建的钥匙串时,我可以在受信任的应用程序列表中看到我的应用程序:
![acl settings](https://istack.dev59.com/epefr.webp)
SecKeychainUnlock(someKeychain, (UInt32)strlen(keychainPass), keychainPass, TRUE);
UInt32 passwordLen = 0;
void *passData = nil;
const char *cUser_name = [NSUserName() cStringUsingEncoding:NSUTF8StringEncoding];
OSStatus genericPassErr = SecKeychainFindGenericPassword(someKeychain, 0, NULL, strlen(cUser_name), cUser_name, &passwordLen, &passData, NULL);
genericPassErr
等于-25293
,这意味着:Error: 0xFFFF9D33 -25293 您输入的用户名或密码不正确。
在代码中早些时候,我运行了SecKeychainSetUserInteractionAllowed(0)
,如果我注释掉这一行,系统会提示我允许应用程序访问钥匙串,如果我同意,一切都可以正常运行。然而,整个问题在于我需要能够在不提示用户的情况下完成操作。由于我已将应用程序添加到ACL中,因此我希望它可以像这样工作。您知道我做错了什么吗?
当我在附加的屏幕截图中勾选“所有程序都可以访问此项目”单选框时,一切也可以正常运行,但我不希望每个人都能访问它,只有列出的应用程序才能访问。
/Library
)。在您看来,运行SecKeychainCreate
作为root的最佳方法是什么? - Michał Siwek