• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - swift 3 : Convert SHA256 hash string to SecCertificate

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:31:37 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

Alamofire 允许使用证书和公钥进行固定(尽管从包中获取公钥的函数从包中的证书中获取 key )。

当从证书中提取公钥时,我能够使固定工作,但是当我提供 SHA256 String 作为公钥(我从 api 调用接收 key 字符串,如果第一次固定失败,它应该用作公钥。)我使用下面的代码将字符串转换为 [SecKey]

//创建服务器信任策略

let serverTrustPolicies: [String: ServerTrustPolicy] = [
                destinationURL!: .pinPublicKeys(
                    publicKeys:savePublicKeys(),
                    validateCertificateChain:true,
                    validateHost:true
                )]
            self.manager = SessionManager(
                serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))

//获取[SecKey]

func savePublicKeys() -> [SecKey]
{
    var key:SecKey?
    var publicKeys:[SecKey] = []


    //Check and use if backup key is received from beacon call
    if(KeychainService().checkIfKeyExists(tag: "backupURL"))
    {
        key = KeychainService().obtainKey(tag: backupURLKey)
        publicKeys.append(key!)
    }

    return publicKeys

}

//插入和检索钥匙串(keychain)数据的函数

  func insertPublicKey(publicTag: String, data: Data) -> SecKey? {
    let query: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType): kSecAttrKeyClassPublic,
        String(kSecClass): kSecClassKey as CFString,
        String(kSecAttrApplicationTag): publicTag as CFString,
        String(kSecValueData): data as CFData,
        String(kSecReturnPersistentRef): true as CFBoolean]

    var persistentRef: AnyObject?
    let status = SecItemAdd(query as CFDictionary, &persistentRef)
    if status != noErr && status != errSecDuplicateItem {
        return nil
    }

    return obtainKey(tag: publicTag)
}

func obtainKey(tag: String) -> SecKey? {
    var keyRef: AnyObject?
    let query: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType): kSecAttrKeyClassPublic,
        String(kSecReturnRef): kCFBooleanTrue as CFBoolean,
        String(kSecClass): kSecClassKey as CFString,
        String(kSecAttrApplicationTag): tag as CFString,
        String(kSecReturnPersistentRef): true as CFBoolean
    ]

    let status = SecItemCopyMatching(query as CFDictionary, &keyRef)

    switch status {
    case noErr:
        if let ref = keyRef {
            return (ref as! SecKey)
        }
    default:
        break
    }

    return nil
}

我哪里错了?据我所知,我使用的 String 是一个 base64encoded 并且适用于 Android 部分。



Best Answer-推荐答案


这适用于那些可能在试图找到相同或相似问题的答案时遇到困难的人。

简短回答:散列是一种单行道。虽然理论上您也许可以尝试不同的输入来获取哈希值,从而获得问题中所需的证书数据,但实际上很难做到。已经编写了散列算法来防止您想要在这里实现的目标。要获得所需的输入,您可能需要花费大量的时间、空间和计算能力。

长答案详细了解散列的真正作用。

例如,对于问题中的 SHA256,有 22562256 个可能的哈希值。如果您尝试了 22552255 个不同的输入,则有 50% 的机会。即使您每微秒尝试一次,这也将花费您 10631063 年。这就是为什么这实际上难以实现的主要原因之一。

反转哈希就像试图从它们的和中猜测两个数字 (x+y = 234)。有很多种可能的组合。 有一些很棒的答案here

关于ios - swift 3 : Convert SHA256 hash string to SecCertificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41539477/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap