菜鸟教程小白 发表于 2022-12-12 19:17:35

ios - 共享钥匙串(keychain)中的私有(private)数据


                                            <p><p>我正在为 iOS 钥匙串(keychain)而苦苦挣扎,我似乎找不到任何好的文档。 </p>

<p>无论如何,我有两个应用程序,基本上我想做的就是在钥匙串(keychain)中共享一些数据并保持一些数据私有(private),以便其他应用程序无法访问它。</p>

<p>我尝试实现 Apple 提供的 KeychainItemWrapper,但这根本行不通。我没有共享数据的问题,但如果我没有设置访问组,数据仍然是共享的。我使用的设备不是模拟器,这可能会导致同样的问题。</p>

<p>这是我的代码</p>

<p>应用 1:</p>

<pre><code>KeychainItemWrapper *item = [ initWithIdentifier:@&#34;SharedKeyChainApp&#34; accessGroup:nil];
;
;
</code></pre>

<p>应用 2:</p>

<pre><code>KeychainItemWrapper *keychain = [ initWithIdentifier:@&#34;SharedKeyChainApp&#34; accessGroup:nil];
NSString *data = ;
NSLog(@&#34;data is : %@&#34;,data); //Prints &#34;data is : SecureValue&#34;
</code></pre>

<p>如果我在一个或另一个应用程序中的项目属性中删除我的钥匙串(keychain)组,它不会打印任何内容。但显然我无法再在这两个应用程序之间共享数据了。</p>

<p>谢谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果它是共享的钥匙串(keychain),那么它就是共享的。任何其他可以访问钥匙串(keychain)的应用都可以访问其中的所有数据。</p>

<p>你可以:</p>

<ul>
<li>创建 2 个钥匙串(keychain)。一个共享一个私有(private)。可共享的东西进入共享状态,私有(private)的东西进入私有(private)状态。</li>
<li>加密您不想与他人共享的数据。</li>
</ul>

<p>我可能会选择第一个。恕我直言,<code>KeychainItemWrapper</code> 作为抓取和使用代码非常糟糕。这是旧代码,提供的功能很少。我附上了一段我编写的快速而肮脏的代码,用于在没有 <code>KeychainItemWrapper</code> 的情况下使用 key 链功能进行测试和测试。在这种情况下,我正在使用“应用程序”和“安全”中的项目来创建一些共享和非共享项目。你不能在这里说出来,因为它只是一些测试代码,共享在 Targets->Capabilities->Keychain Sharing 下。</p>

<pre><code>- (void)viewDidLoad {
    ;

//    ;
//    ;
    ;
}

- (void)searchForKeychainItems {
    ;

    NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                            (__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitAll,
                            (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue,       // returns password
                            (__bridge id)kSecReturnAttributes: (__bridge id)kCFBooleanTrue, // returns rest of data
//                            (__bridge id)kSecAttrAccessGroup: @&#34;AAAAAAAAAA.com.foo.Security&#34;
//                            (__bridge id)kSecAttrAccessGroup: @&#34;AAAAAAAAAA.com.foo.app&#34;
                        };

    OSStatus resultCode;
    CFArrayRef *searchResults = nil;
    resultCode = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&amp;searchResults);

    NSArray *foo = CFBridgingRelease(searchResults);
    ];
    ];
    NSDictionary *keychainItem = foo;
    NSString *password = [ initWithData: encoding:NSUTF8StringEncoding];
    ];
}

- (void)addKeychainItem {
    ;

    NSDictionary *genericDataDictionary = @{@&#34;authState&#34;: @&#34;1&#34;,
                                          @&#34;lastAuthDate&#34;: @&#34;2/11/2014&#34;,
                                          @&#34;otherCrap&#34;: @&#34;poo&#34;};
    NSData *encodedGenericData = ;
    NSData *encodedPassword = [@&#34;secret&#34; dataUsingEncoding:NSUTF8StringEncoding];

    NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                            (__bridge id)kSecAttrCreator: @&#34;MyCom&#34;,
                            (__bridge id)kSecAttrComment: @&#34;keychain tests&#34;,
                            (__bridge id)kSecAttrService: @&#34;Credentials&#34;,
                            (__bridge id)kSecAttrAccount: @&#34;username&#34;,
                            (__bridge id)kSecValueData: encodedPassword,
                        (__bridge id)kSecAttrGeneric: encodedGenericData,
                        (__bridge id)kSecAttrAccessGroup: @&#34;AAAAAAAAAA.com.foo.Security&#34;
                        };

    OSStatus result;
    result = SecItemAdd((__bridge CFDictionaryRef)query, NULL);
    NSLog(@&#34;Add status code: %d&#34;, (int)result);
}

- (void)removeKeychainItem {
    ;

    NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
//                            (__bridge id)kSecAttrCreator: @&#34;MyCom&#34;,
//                            (__bridge id)kSecAttrService: @&#34;Credentials&#34;,
                            (__bridge id)kSecAttrComment: @&#34;New Keychain standards Test Item&#34;,
//                            (__bridge id)kSecAttrAccount: @&#34;username&#34;,
//                            (__bridge id)kSecValueData: [@&#34;password&#34; dataUsingEncoding:NSUTF8StringEncoding],
//                            (__bridge id)kSecAttrGeneric: encodedGenericData
                            //                            (__bridge id)kSecAttrAccessGroup: @&#34;AAAAAAAAAA.com.foo.Security&#34;
                            };

    OSStatus resultsCode;
    resultsCode = SecItemDelete((__bridge CFDictionaryRef)query);
    NSLog(@&#34;Delete results code: %d&#34;, (int)resultsCode);
}

- (void)log:(NSString *)text {
    self.textView.text = [ stringByAppendingString:@&#34;\n&#34;];
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 共享钥匙串(keychain)中的私有(private)数据,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/21989601/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/21989601/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 共享钥匙串(keychain)中的私有(private)数据