我想在 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 是个好主意吗?如何在 casted SecKey 上使用 isEqual?任何可以解释我吗?
附言。 另一个想法是从 SecKey 获取 base64 - 我尝试过并且它也有效,但它需要 KeyChain 临时操作并且看起来不专业。
最佳答案
从标题中引用:
“大多数 SecKeychainItem 函数都适用于 SecKeyRef。”*
您可以将 SecKeyRef
转换为 SecKeychainItem
。如果这是一个有效的操作(即 key 是一个钥匙串(keychain)项),你可以应用函数
SecKeychainItemCreatePersistentReference
并得到一个 CFData
对象,其中填充了属性和数据。然后使用 memcpy
检查字节或将其转换为 NSData
对象并使用 isEqualToData
检查。不要忘记释放 CFData
对象。
编辑
在 iOS 上,据我所知,唯一可靠的方法是使用临时 key 将数据(或 secret )复制到钥匙串(keychain)中,以便您可以再次找到它,然后提取数据。这很麻烦,但如果你只是以极简的方式实现它,它应该不会超过 30 行代码。我有一个工作示例。
我通常的免责声明:使用它需要您自担风险,并始终注意安全问题。
关于ios - 比较 ios Swift 中的两个 secKey(公钥),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35009105/