簡體   English   中英

可可:將項目添加到自定義OS X鑰匙串中,以便任何其他應用程序都可以訪問它而無需提示

[英]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);

但:

  1. 我不知道函數SecACLCreateWithSimpleContents是否是實現此目標的正確方法
  2. 如果是這樣,我不知道如何將用它創建的ACLlist寫回到someItem
  3. 我不知道如何使用這些返回的CFArray(我是位Objective-C初學者)

我知道這是有可能的,因為當我將新創建的鑰匙串導入“鑰匙串訪問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
  • 使用上述API創建鑰匙串項時傳遞SecAccessRef

我對此問題(重復?)添加了一個較長的答案: 如何允許所有應用程序在沒有提示的情況下訪問鑰匙串項目

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM