[英]Cocoa: adding an item to a custom OS X keychain so it could be accessed by any other application without prompt
我創建了一個自定義鑰匙串,然后以這種方式在其中保存了一個密碼:
SecKeychainRef someKeychain; //keychain reference
SecKeychainItemRef someItem; //keychain key item reference
SecKeychainCreate([keychainPath UTF8String], (UInt32)strlen(keychainPass), keychainPass, FALSE, NULL, &someKeychain);
SecKeychainAddGenericPassword(someKeychain, (UInt32)strlen(someServiceName), someServiceName, (UInt32)strlen(someAccountName), someAccountName, (UInt32)strlen(encryptedPass), encryptedPass, &someItem);
我現在想做的是使任何知道keychainPass
應用程序someItem
可以訪問添加的someItem
,而不會提示用戶允許。 所以我這樣嘗試了:
SecACLRef aclList;
SecAccessRef itemAccessRef;
uid_t userid = 0;
gid_t groupid;
CFArrayRef aclListArr;
SecACLRef newAcl;
SecKeychainItemCopyAccess(someItem, &itemAccessRef);
SecAccessCopyOwnerAndACL(itemAccessRef, &userid, &groupid, (UInt32*)kSecUseOnlyUID, &aclListArr);
SecACLCreateWithSimpleContents(itemAccessRef, NULL, (__bridge CFStringRef)@"someTagName", kSecKeychainPromptInvalid, &newAcl);
但:
SecACLCreateWithSimpleContents
是否是實現此目標的正確方法 someItem
我知道這是有可能的,因為當我將新創建的鑰匙串導入“鑰匙串訪問OS X”應用程序中,並且將someItem
的屬性標記為可被任何應用程序訪問時,提示消失了,一切正常。 我不知道如何以編程方式實現這一目標。 我意識到這可能是一個愚蠢的問題,但是我不知道該怎么辦。
我來自iOS,但根據參考文檔,它應該大致相同。
您需要將SecItemAdd與選項[kSecAttrAccessGroup)一起使用( https://developer.apple.com/library/mac/documentation/security/Reference/keychainservices/Reference/reference.html#//apple_ref/c/data/kSecAttrAccessGroup ) 。 看看SecItemAdd的參考文檔
這是一篇步行的帖子 ,其中包含一些有關如何使用SecItemAdd的示例代碼。
您需要做的是為商品和鑰匙串設置訪問控制列表
這是創建訪問參考的代碼
#pragma mark - Keychain Access Methods
+ (SecAccessRef)createAccess:(NSString *)accessLabel
{
OSStatus err;
SecAccessRef access = nil;
NSArray *trustedApplications = nil;
SecTrustedApplicationRef myself;
err = SecTrustedApplicationCreateFromPath(NULL, &myself);
if (err)
return nil;
trustedApplications = [NSArray arrayWithObjects:(__bridge id)myself, nil];
err = SecAccessCreate((__bridge CFStringRef)accessLabel,(__bridge CFArrayRef)trustedApplications, &access);
if (err)
return nil;
return access;
}
您沒有指定應用程序是否創建鑰匙串,但是如果指定了鑰匙串,則可以在使用此代碼創建應用程序時允許它。
// Create Keychain
SecKeychainCreate(name, (UInt32)[password length], [password cStringUsingEncoding:NSUTF8StringEncoding], false, [self createAccess:keychainKey], NULL);
這將使您的應用程序可以訪問該鑰匙串中的任何項目。 創建單個項目時,您也可以傳遞訪問控制引用。
您可以通過使用接受SecAccessRef
參數的舊版安全性API方法,對新的鑰匙串項目(在macOS下)實現“允許所有應用程序訪問此項目”訪問權限:
SecKeychainItemCreateFromContent()
SecKeyCreatePair()
(在OS X 10.7中已棄用,但仍然有效) 即:
SecAccessCreate()
或SecAccessCreateWithOwnerAndACL()
創建SecAccessRef
SecACLCreateWithSimpleContents()
,使用Any
授權,無提示行為( SecKeychainPromptSelector = 0
)和NULL
受信任的應用程序列表,將單個ACL條目添加到SecAccessRef
。 SecAccessRef
我對此問題(重復?)添加了一個較長的答案: 如何允許所有應用程序在沒有提示的情況下訪問鑰匙串項目
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.