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

标签 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 是个好主意吗?如何在 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/

相关文章:

ios - rx.tap 订阅已完成的按钮

objective-c - ObjectiveZlib 未解压

ios - 底部空间到: UIView Constraint

ios - 有人能告诉我什么是 iOS 中的移动设备证书身份验证吗?使用它的目的是什么?

Java 安全地执行 shell 命令

ios - 在 Sprite Kit 中,如何使坠落物体在相交时不会受到其他物体的影响?

swift - Swift 中的 UITextField "text"属性 setter

ios - 使用 RxSwift 对成员 'tableView' 的引用不明确

ios - 如果任务被取消,则不执行该 block

java - 操纵密码