- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试将私钥添加到 iOS 钥匙串(keychain)中。证书(公钥)工作正常但私钥拒绝...我完全不明白为什么以下代码不起作用。
首先,我检查当前 key (=key,如果钥匙串(keychain)是一个键/值存储)在钥匙串(keychain)中是否“空闲”。然后我要添加私钥。
CFStringRef labelstring = CFStringCreateWithCString(NULL, [key cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8);
NSArray* keys = [NSArray arrayWithObjects:(__bridge id)kSecClass,kSecAttrLabel,kSecReturnData,kSecAttrAccessible,nil];
NSArray* values = [NSArray arrayWithObjects:(__bridge id)kSecClassKey,labelstring,kCFBooleanTrue,kSecAttrAccessibleWhenUnlocked,nil];
NSMutableDictionary* searchdict = [NSMutableDictionary dictionaryWithObjects:values forKeys:keys];
CFRelease(labelstring);
NSMutableDictionary *query = searchdict;
CFTypeRef item = NULL;
OSStatus error = SecItemCopyMatching((__bridge_retained CFDictionaryRef) query, &item);
if (error)
{
NSLog(@"Error: %ld (statuscode)", error);
}
if(error != errSecItemNotFound)
{
SecItemDelete((__bridge_retained CFDictionaryRef) query);
}
[query setObject:(id)data forKey:(__bridge id)kSecValueData];
OSStatus status = SecItemAdd((__bridge_retained CFDictionaryRef) query, &item);
if(status)
{
NSLog(@"Keychain error occured: %ld (statuscode)", status);
return NO;
}
调试输出如下:
2012-07-26 15:33:03.772 App[15529:1b03] Error: -25300 (statuscode)
2012-07-26 15:33:11.195 App[15529:1b03] Keychain error occured: -25299 (statuscode)
第一个错误代码-25300
代表errSecItemNotFound
。所以没有为这个键存储任何值。然后,当我尝试将私钥添加到钥匙串(keychain)中时,我得到 -25299
,这意味着 errSecDuplicateItem
。我不明白。为什么会这样?
有人对此有线索或提示吗?
Apple 的错误代码:
errSecSuccess = 0, /* No error. */
errSecUnimplemented = -4, /* Function or operation not implemented. */
errSecParam = -50, /* One or more parameters passed to a function where not valid. */
errSecAllocate = -108, /* Failed to allocate memory. */
errSecNotAvailable = -25291, /* No keychain is available. You may need to restart your computer. */
errSecDuplicateItem = -25299, /* The specified item already exists in the keychain. */
errSecItemNotFound = -25300, /* The specified item could not be found in the keychain. */
errSecInteractionNotAllowed = -25308, /* User interaction is not allowed. */
errSecDecode = -26275, /* Unable to decode the provided data. */
errSecAuthFailed = -25293, /* The user name or passphrase you entered is not correct. */
提前致谢!
更新 #1:我发现它只在第一次起作用。即使数据和 key 不同,在第一次存储到钥匙串(keychain)后我也无法存储更多 key 。
最佳答案
以下代码对我有用:
NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
[query setObject:(id)kSecClassKey forKey:(id)kSecClass];
[query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible];
[query setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
//adding access key
[query setObject:(id)key forKey:(id)kSecAttrApplicationTag];
//removing item if it exists
SecItemDelete((CFDictionaryRef)query);
//setting data (private key)
[query setObject:(id)data forKey:(id)kSecValueData];
CFTypeRef persistKey; OSStatus status = SecItemAdd((CFDictionaryRef)query, &persistKey);
if(status) {
NSLog(@"Keychain error occured: %ld (statuscode)", status);
return NO;
}
关于ios - 将私钥添加到 iOS Keychain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11670647/
这被要求作为这个 SO 的跟进: Add a keychain to search list? 我们知道如何通过以下方式将新创建的钥匙串(keychain)添加到搜索列表中: security lis
我一直在尝试在 iPhone 应用程序中使用持久钥匙串(keychain)引用。我发现如果我创建了两个不同的钥匙串(keychain)项目,我每次都会得到不同的持久引用(它们看起来像“genp....
无论我使用哪个访问组,我都无法在 iOS 模拟器上的 Keychain 中保存数据。使用真实设备一切正常。是否可以在模拟器上使用钥匙串(keychain)? 顺便说一句,我使用 SwiftKeycha
直到 Xcode 8/iOS 10,我才能够从静态库的单元测试中访问钥匙串(keychain)。升级后,出现错误,请参阅堆栈跟踪: failed: caught "NSInternalInconsis
我正在开发一个应用程序,我需要使用钥匙串(keychain)存储和检索用户数据,如(用户名、密码、url、域名等)。但我发现有可用的预定义键,例如(kSecAttrAccount、kSecAttrDe
有5 types of keys可以存储在 iOS 钥匙串(keychain)中 kSecClassGenericPassword kSecClassInternet 密码 kSecClassCert
我们有一个启动守护进程(出于各种原因,它必须以 root 身份运行),并通过网络与服务器组件进行通信。它需要通过服务进行身份验证,因此当它第一次获取密码时,我们将其保存到系统钥匙串(keychain)
我使用 iOS keychain wrapper 编写了一个项目存储用户名和密码,项目工作正常,直到昨天。 在我对项目运行 clean 命令后,项目崩溃: - (void)writeToKeychai
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
为了授予快速用户身份验证,想法是使用 wifi(企业)网络的相同凭据。是否可以从应用程序获取用于网络访问的用户/密码? 我的意思是,以编程方式访问设备钥匙串(keychain)? 最佳答案 从此app
我实现了这段代码 https://github.com/exchangegroup/keychain-swift使用钥匙串(keychain)。我作为一个该死的初学者的问题: 我使用 parse.co
这一切都发生在我的模拟器中。在练习使用钥匙串(keychain)包装时,我发现自己处于一种奇怪的情况。我试图学习如何从钥匙串(keychain)插入和检索数据,为了做到这一点,我开始了一个新项目,其中
我一直在阅读该文档,但我感到困惑。 有iOS钥匙串(keychain)here . 还有 iCloud 钥匙串(keychain) here . 它们都称为钥匙串(keychain),都能够本地存储并
我最近买了一台新的 Macbook Pro,并将我的旧数据迁移到了它上面。从那时起,Xcode 拒绝在物理设备上构建。模拟器工作正常(因为我认为它不需要代码签名)。 我收到的错误是这样的:“在钥匙串(
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在脚本中运行 xcodebuild 来存档和导出我的项目。我正在使用钥匙串(keychain)文件进行代码签名。为了避免提示输入钥匙串(keychain)密码,我使用 security unloc
我正在使用 KeychainItemWrapper 类(项目中集成的 .h 和 .m 文件)在 Keychain for iOS App 中保存密码。还在项目中需要的地方导入“安全”框架和“keych
我正在尝试使用 Jenkins 打包一个 iOS ipa。所以我得到了 Keychains and Provisioning Profiles Management 插件并尝试上传它需要的钥匙串(ke
我在调用 SecItemAdd 时没有找到有关此类错误代码的信息,可能是什么原因造成的? 提前致谢 编辑:这是我得到错误的函数: + (BOOL)storeWithKey:(NSString *)ke
我正在尝试签署 iPhone 应用程序以供发布,因此我按照说明进行操作。无论如何,在创建我的证书签名请求时,我从钥匙串(keychain)访问中收到此错误:“找不到默认钥匙串(keychain)” 我
我是一名优秀的程序员,十分优秀!