Alamofire
позволяет фиксировать с использованием сертификатов, а также открытых ключей (хотя функция получения открытых ключей из пакета получает ключи от сертификатов в комплекте).Swift 3: преобразовать хэш-строку SHA256 в SecCertificate
Я могу сделать пиннинг работы, когда открытые ключи извлекаются из сертификатов, но пиннинг терпит неудачу, когда я поставить SHA256
String
как открытый ключ (я получаю строку ключа от вызова апи и его предполагается использовать в качестве открытого ключа, если первый пиннинга терпит неудачу.) Я использую этот код, чтобы преобразовать строку в политике доверия [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.
Я добавил основное объяснение, почему это было бы трудно, как ответ здесь. Хотя я хочу, чтобы люди были осведомлены о хэшировании и безопасности, это могло бы стать дебатами о криптографии и математике. Если модераторы чувствуют это правильно, они могут заблокировать этот вопрос. – SagarU