首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用iOS将RSA公钥存储到kSecAttrAccessible密钥链中

使用iOS将RSA公钥存储到kSecAttrAccessible密钥链中
EN

Stack Overflow用户
提问于 2014-10-17 17:43:00
回答 1查看 1.8K关注 0票数 4

因此,我知道可以使用以下代码将RSA密钥存储到密钥链中:

代码语言:javascript
复制
+ (void)savePublicKeyToKeychain:(NSData *)key tag:(NSString *)tagString deleteExisting:(BOOL)deleteExisting {
    NSData *tag = [SecKeyWrapper getKeyTag:tagString];

    NSDictionary *saveDict = @{
            (__bridge id) kSecClass : (__bridge id) kSecClassKey,
            (__bridge id) kSecAttrKeyType : (__bridge id) kSecAttrKeyTypeRSA,
            (__bridge id) kSecAttrApplicationTag : tag,
            (__bridge id) kSecAttrKeyClass : (__bridge id) kSecAttrKeyClassPublic,
            (__bridge id) kSecValueData : key
    };
    [self saveKeyToKeychain:saveDict tag:tagString deleteExisting:deleteExisting];
}

+ (void)saveKeyToKeychain:(NSDictionary *)saveDict tag:(NSString *)tagString deleteExisting:(BOOL)deleteExisting {
    OSStatus sanityCheck = SecItemAdd((__bridge CFDictionaryRef) saveDict, NULL);
    if (sanityCheck != errSecSuccess) {
        if (sanityCheck == errSecDuplicateItem && deleteExisting) {
            // delete the duplicate and save again
            SecItemDelete((__bridge CFDictionaryRef) saveDict);
            sanityCheck = SecItemAdd((__bridge CFDictionaryRef) saveDict, NULL);
        }
        if (sanityCheck != errSecSuccess) {
            NSLog(@"Problem saving the key to keychain, OSStatus == %d.", (int) sanityCheck);
        }
    }
    // remove from cache
    [keyCache removeObjectForKey:tagString];
}

这个我可以正确保存和取回。如果我试图在保存上设置kSecAttrAccessible值:

代码语言:javascript
复制
+ (void)savePublicKeyToKeychain:(NSData *)key tag:(NSString *)tagString deleteExisting:(BOOL)deleteExisting {
    NSData *tag = [SecKeyWrapper getKeyTag:tagString];

    NSDictionary *saveDict = @{
            (__bridge id) kSecClass : (__bridge id) kSecClassKey,
            (__bridge id) kSecAttrKeyType : (__bridge id) kSecAttrKeyTypeRSA,
            (__bridge id) kSecAttrApplicationTag : tag,
            (__bridge id) kSecAttrKeyClass : (__bridge id) kSecAttrKeyClassPublic,
            (__bridge id) kSecAttrAccessible: (__bridge id) kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly,
            (__bridge id) kSecValueData : key
    };
    [self saveKeyToKeychain:saveDict tag:tagString deleteExisting:deleteExisting];
}

然后试图找回,我得到了垃圾。这是垃圾,因为当我在保存后立即检索它时,插入的值和检索到的值是不同的。

有人有代码示例或知道如何设置密钥链项的可访问性,特别是RSA密钥吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 18:32:58

对于公共知识来说,用于将数据存储到密钥链中的属性需要是,也就是用于从密钥链检索数据的属性。如果您缺少其中一个属性,即使它似乎只是存储所需的属性(如kSecAttrAccessible),您也会得到错误的数据。你甚至连errSecItemNotFound都得不到。它还垃圾。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26430563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档