我正在玩Apple的Security
框架。阅读文档后,我遇到SecKeyGenerateSymmetric
,它用于生成随机对称密钥,给定一组CFMutableDictionaryRef
参数。
所以,我尝试生成一个128位AES密钥,带有一些自定义参数,这里是代码:
SecKeyRef key;
CFMutableDictionaryRef parameters = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(parameters, kSecAttrKeyType, kSecAttrKeyTypeAES);
int32_t rawnum = 128;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &rawnum);
CFDictionarySetValue(parameters, kSecAttrKeySizeInBits, num);
CFDictionarySetValue(parameters, kSecAttrIsPermanent, kCFBooleanTrue);
CFErrorRef *error;
key = SecKeyGenerateSymmetric(parameters, error);
因此,正如您所看到的,我使用CFDictionarySetValue(parameters, kSecAttrIsPermanent, kCFBooleanTrue);
指定密钥应保存在钥匙串中。执行后,一切正常,密钥保存。然而,我注意到,当多次运行程序时(我从Xcode测试),添加到钥匙串的密钥是相同(我已经通过导出密钥并观察原始密钥数据来验证)。
但是,如果我关闭Xcode,重新打开它,再次执行代码,关键是不同的。所以我想SecKeyRef
对象存储在内存中,如果我多次调用SecKeyGenerateSymmetric
,那么密钥会从内存中获取?如果是这样,我如何重新设置密钥对象以创建多个密钥?
如果你能帮助我,请提前致谢!
编辑1
我写了这个函数,以生成更多的键:
void _generateKey(NSString *keyLabel) {
SecKeyRef key;
CFMutableDictionaryRef parameters = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(parameters, kSecAttrKeyType, kSecAttrKeyTypeAES);
int32_t rawnum = 128;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &rawnum);
CFDictionarySetValue(parameters, kSecAttrKeySizeInBits, num);
CFStringRef yourFriendlyCFString = (__bridge CFStringRef)keyLabel;
CFDictionarySetValue(parameters, kSecAttrLabel, yourFriendlyCFString);
CFDictionarySetValue(parameters, kSecAttrIsPermanent, kCFBooleanTrue);
CFErrorRef *error;
key = SecKeyGenerateSymmetric(parameters, error);
}
但如果我在main
中使用两个不同的标签调用它两次,则只生成第一个键。
编辑2
通过在两个调用之间放置一个sleep
函数来解决问题,现在没有任何问题!
答案 0 :(得分:1)
您尝试使用相同的kSecAttrLabel
创建永久键两次(根据Apple文档,默认值为NULL
)。现在,由于此密钥将映射到同一位置,因此您不会覆盖现有密钥可能是一件好事。要创建多个键,请使用不同的标签。如果要重新创建相同的密钥,首先应该SecItemDelete
密钥,然后重新创建密钥。