簡體   English   中英

iCloud同步鑰匙串

[英]iCloud sync keychain

在我的應用程序中,我希望能夠同步用戶創建的配置。 我想使用iCloud來同步該配置,以便它在所有設備上始終相同。 但是,我使用鑰匙串來存儲密碼。

有沒有辦法同步鑰匙串數據?

iCloud Keychain是iOS 7.0.3和OS X Mavericks 10.9中的新功能。 使用SecItem API添加鑰匙串項時指定kSecAttrSynchronizable屬性。

不,鑰匙串同步不是iCloud的一部分。 它是點mac同步的一部分,但已不再可用。

可能會有關於這是否是一個好主意的反饋(自動將密碼從一個設備移動到另一個設備),特別是在多人共享iCloud帳戶的情況下(可能,但現在不能保證)。

如果您認為將密碼存儲在設備的鑰匙串上(因此要求用戶每台設備至少輸入一次密碼),那么您需要提供自己的加密和安全性並將數據直接存儲在iCloud中,例如密鑰庫。

這些是我為鑰匙串制作的實用方法。 kSecAttrSynchronizable是iCloud Sync工作的原因。 希望他們幫忙。

  • 鑰匙串查詢。
  • 除去項目
  • 刪除項目
  • 保存項目
  • 加載項目

     + (NSMutableDictionary *)getKeychainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecClass, service, (__bridge id)kSecAttrService, service, (__bridge id)kSecAttrAccount, service, (__bridge id)kSecAttrSynchronizable, (__bridge id)kSecAttrAccessibleAfterFirstUnlock, (__bridge id)kSecAttrAccessible, nil]; } + (void)save:(NSString *)service data:(id)data { NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; SecItemDelete((__bridge CFDictionaryRef)keychainQuery); [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL); } + (void)remove:(NSString *)service { NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; SecItemDelete((__bridge CFDictionaryRef)keychainQuery); } +(NSString *)keychainItem:(NSString *)service{ id data = [self load:service]; if([data isKindOfClass:[NSString class]]){ return data; } return @""; } + (id)load:(NSString *)service { id ret = nil; NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; CFDataRef keyData = NULL; if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { @try { ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; } @catch (NSException *e) { NSLog(@"Unarchive of %@ failed: %@", service, e); } @finally {} } if (keyData) CFRelease(keyData); return ret; } 

想要做同樣的事情,還沒有嘗試,但這看起來很有幫助: https//github.com/iosengineer/BMCredentials

暫無
暫無

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

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