SecKeyGenerateSymmetric生成相同的密钥

时间:2014-12-28 16:44:32

标签: objective-c encryption aes

我正在玩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函数来解决问题,现在没有任何问题!

1 个答案:

答案 0 :(得分:1)

您尝试使用相同的kSecAttrLabel创建永久键两次(根据Apple文档,默认值为NULL)。现在,由于此密钥将映射到同一位置,因此您不会覆盖现有密钥可能是一件好事。要创建多个键,请使用不同的标签。如果要重新创建相同的密钥,首先应该SecItemDelete密钥,然后重新创建密钥。