簡體   English   中英

Swift 3:將SHA256哈希字符串轉換為SecCertificate

[英]Swift 3: Convert SHA256 hash string to SecCertificate

Alamofire允許使用證書和公共密鑰進行固定(盡管從捆綁軟件中獲取公共密鑰的功能從捆綁軟件中的證書獲取密鑰)。

當從證書中提取公鑰時,我可以進行固定, 但是當我提供SHA256 String作為公鑰時,固定會失敗 (我從api調用接收到了密鑰字符串,並且應該將其用作如果第一次固定失敗,則使用公共密鑰。)我使用下面的代碼將字符串轉換為[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

}

//用於插入和檢索鑰匙串數據的函數

  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
}

我要去哪里錯了? 據我所知,我使用的Stringbase64encodedString ,可在Android部分使用。

這是針對可能偶然發現相同或相似問題答案的其他人的。

簡短的答案:哈希是一條單向的街道。 理論上講,您可能可以嘗試使用不同的輸入來獲取哈希值,從而根據問題中的要求獲取證書數據,但實際上這樣做是非常困難的。 已經編寫了散列算法以完全防止您想要在此處實現的目標。 為了獲得所需的輸入,您可能必須花費大量的時間,空間和計算能力。

長答案詳細了解散列的真正作用。

例如,對於問題中的SHA256,有22562256個可能的哈希。 如果嘗試了22552255個不同的輸入,則有50%的機會。 即使您每微秒嘗試一次,這也將花費您10631063年。 這是實際上難以實現的主要原因之一。

反轉哈希就像嘗試從它們的和中猜出兩個數字(x + y = 234)。 很多可能的組合。 有一些偉大的答案在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM