2017-01-09 22 views
2

Alamofire証明書と公開鍵を使用して固定することができます(ただし、バンドルから公開鍵を取得する機能はバンドル内の証明書から鍵を取得します)。Swift 3:SHA256ハッシュ文字列をSecCertificateに変換する

私は、公開鍵が証明書から抽出されたときにピン留め作業をすることができていますが、ピニングが、私は、公開鍵としてSHA256Stringを供給したときに(私はAPI呼び出しからキー文字列を受け取る失敗し、その最初のピニングが失敗した場合、公開鍵として使用されることを想定している。)私は

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

//取得[SecKey]

//作成し、サーバーの信頼ポリシーに文字列を変換するには、以下のコードを使用します[SecKey]

私が間違っているつもりです

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 
} 

キーチェーンデータを挿入して取得するための0

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 

} 

//関数?私が知っているから、私が使用するStringbase64encodedであり、Androidの部分で動作します。

+0

これは答えが難しい理由についての基本的な説明を追加しました。私は人々にハッシュとセキュリティについて知らされたいと思っていますが、これは暗号と数学について議論に転じるかもしれません。司会者が正しいと感じるならば、この質問をロックすることができます。 – SagarU

答えて

0

これは、同じまたは類似の質問に対する回答を見つけようとするときに遭遇する可能性がある他の人のためのものです。

短い回答:ハッシングは、片道の通りです。 理論的にはですが、ハッシュ値を取得するために異なる入力を試すことができ、質問に必要な証明書データを得ることができます。現実的にこれは非常に困難です。ハッシュアルゴリズムは、あなたがここで達成したいことを正確に防ぐために書かれています。希望の入力を得るには、膨大な時間、スペース、計算能力を費やさなければならないかもしれません。

ロングアンサーハッシュが本当に何をしているかを詳しく読んでください。

たとえば、問題のSHA256には22562256個の可能なハッシュがあります。 22552255異なる入力を試した場合、50%の可能性があります。 1マイクロ秒ごとに試しても、10631063年かかるでしょう。それが実現するのが現実的に難しい主な理由の1つです。

ハッシュを逆にすることは、合計(x + y = 234)から2つの数を推測しようとするようなものです。考えられる組み合わせののロットがあります。 いくつかの偉大な答えがありますhere

関連する問題