使用kSecAttrApplicationTag

时间:2018-07-23 12:48:53

标签: ios objective-c realm keychain

当尝试使用kSecAttrApplicationTag使用钥匙串存储和查询关键项时,我面临一个奇怪的行为。似乎即使插入一个64字节的随机密钥后,我得到一个状态代码0(成功存储),之后我也无法从钥匙串中检索/查询它。超级奇怪的是,这个问题似乎是随机的(并非每次都发生)。

这里有一些我正在从事的工作以及遇到问题的背景。我正在尝试生成/查询一个64字节的随机密钥,以用于加密Realm持久性。项目创建如下:

uint8_t buffer[64];
SecRandomCopyBytes(kSecRandomDefault, 64, buffer);
NSData *keyData = [[NSData alloc] initWithBytes:buffer length:sizeof(buffer)];
NSDictionary *item = @{(__bridge id)kSecClass: (__bridge id)kSecClassKey,
                       (__bridge id)kSecAttrApplicationTag: tagData,
                       (__bridge id)kSecAttrKeySizeInBits: @512,
                       (__bridge id)kSecValueData: keyData,
                       (__bridge id)kSecAttrAccessible: (__bridge id)kSecAttrAccessibleAfterFirstUnlock};

,项目查询如下:

NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassKey,
                        (__bridge id)kSecAttrApplicationTag: tagData,
                        (__bridge id)kSecAttrKeySizeInBits: @512,
                        (__bridge id)kSecReturnData: @YES};

CFTypeRef dataRef = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataRef);

您可能会注意到,先前的代码段中未定义tagData。问题是,如果我使用以下代码行创建tagData

//Approach 1
uint8_t kKeychainIdentifier[] = "an.application.tag";
tagData =  [[NSData alloc] initWithBytesNoCopy:(void *)kKeychainIdentifier length:sizeof(kKeychainIdentifier) freeWhenDone:NO];

我遇到了这种奇怪的随机行为。但是,如果我使用以下代码行,那么一切似乎都很好并且可以正常工作

//Approach 2
NSData *tag = ["an.application.tag" dataUsingEncoding:NSUTF8StringEncoding];

现在我的问题是,钥匙串中到底发生了什么我无法持久表现的事情?第一种方法错误吗?我观察到,当两​​种方法都打印出时,十六进制值在最后两位数字上有所不同,而第二种方法以00结尾,而第一种方法没有。但是,如果始终保持不变,这如何对钥匙串中的物品进行存储和检索呢?

0 个答案:

没有答案