比较ios Swift中的两个secKey(公钥)

时间:2016-01-26 07:54:08

标签: ios swift security

我想在swift中ssl公钥锁定,我读了很多例子怎么做,最后想想我找不到的是如何比较SecKey对象格式的两个公钥。 例如:

let serverPublicKey = SecTrustCopyPublicKey(secTrust) /*return SecKey object from actual SecTrust*/
let clientPublicKey = getLocalPublicKeyFromDer() /*return SecKey from .der local*/

如何比较它们?现在我这样做,它的工作原理:

if(serverPublicKey! as AnyObject).isEqual(clientPublicKey){
  /*Key is the same, pinning OK!*/
}

在gitHub上找到它:https://github.com/teamcarma/IOS-AlamofireDomain/blob/master/Source/ServerTrustPolicy.swift

但是转向AnyObject是一个好主意吗?如何工作isEqual在铸造的SecKey?可以解释一下吗?

PS。 另一个想法是从SecKey获得base64 - 我尝试它也可以工作,但它需要一个KeyChain临时操作,看起来没有专业。

4 个答案:

答案 0 :(得分:1)

引自标题:

“大多数SecKeychainItem 函数都适用于SecKeyRef。”*

您可以将SecKeyRef投射到SecKeychainItem。如果这是一个有效的操作(即,键是一个钥匙串项),您可以应用函数

SecKeychainItemCreatePersistentReference

并获取一个CFData对象,其中包含属性和数据。然后检查字节上的memcpy或将其转换为NSData对象并使用isEqualToData进行检查。不要忘记释放CFData对象。

修改

在iOS上,据我所知,唯一可靠的方法是使用临时密钥将数据(或秘密)复制到钥匙串中,以便您可以再次找到它,然后提取数据。这很麻烦,但如果你只是以简约的方式实现它,它不应该超过30行代码。我有一个有效的例子。

通常的免责声明:使用此风险需要您自担风险,并始终注意安全事项。

答案 1 :(得分:0)

只需获取NSDataCan I get the modulus or exponent from a SecKeyRef object in Swift?

即可查看此答案

然后,您可以使用NSData

比较两个isEqualToData:个实例

答案 2 :(得分:0)

添加了iOS10:

CFDataRef _Nullable SecKeyCopyExternalRepresentation(SecKeyRef key, CFErrorRef *error)

因此您现在可以创建两个Data(NSData)对象,然后进行比较。

答案 3 :(得分:-4)

我没有在域中进行体验,但如果它们是两个字符串(无论其内容如何),您基本上都会做一个简单的检查:

if(string1 == string2)
{
 //condition logic
}