2017-01-09 2 views
2

Alamofire позволяет фиксировать с использованием сертификатов, а также открытых ключей (хотя функция получения открытых ключей из пакета получает ключи от сертификатов в комплекте).Swift 3: преобразовать хэш-строку SHA256 в SecCertificate

Я могу сделать пиннинг работы, когда открытые ключи извлекаются из сертификатов, но пиннинг терпит неудачу, когда я поставить SHA256String как открытый ключ (я получаю строку ключа от вызова апи и его предполагается использовать в качестве открытого ключа, если первый пиннинга терпит неудачу.) Я использую этот код, чтобы преобразовать строку в политике доверия [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 
} 

Где я буду неправильно? Из того, что я знаю, String Я использую base64encoded один и работает в части Android.

+0

Я добавил основное объяснение, почему это было бы трудно, как ответ здесь. Хотя я хочу, чтобы люди были осведомлены о хэшировании и безопасности, это могло бы стать дебатами о криптографии и математике. Если модераторы чувствуют это правильно, они могут заблокировать этот вопрос. – SagarU

ответ

0

Это для других, кто может споткнуться, пытаясь найти ответ на тот же или похожий вопрос.

Краткий ответ: Хешинг - это односторонняя улица. В то время как теоретически, вы можете попробовать разные входы для получения хэша и, таким образом, получить данные сертификата по вашему желанию, реалистично это очень сложно сделать. Алгоритмы хэширования были написаны, чтобы предотвратить то, что вы хотите достичь именно здесь. Чтобы получить желаемый вход, вам, возможно, придется потратить огромное количество времени, пространства и вычислительной мощности.

Long Answer Подробнее читайте, что на самом деле делает хеширование.

Например, для SHA256 в вопросе есть 22562256 возможных хешей. Вероятность 50%, если вы пробовали 22552255 различных входов. Даже если вы пробовали один раз каждые микросекунды, вам понадобится 10631063 года. Это одна из основных причин, по которой это реально трудно достичь.

Реверсирование хэша похоже на попытку угадать два числа из их суммы (x + y = 234). Есть лот возможных комбинаций. Есть несколько отличных ответов here

Смежные вопросы