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
}
我哪里错了?据我所知,我使用的String
是base64encoded
个,适用于Android部分。
答案 0 :(得分:0)
这是针对其他可能偶然发现试图找到相同或类似问题的答案的人。
简答:哈希是一种单行道。虽然理论上 ,但您可以尝试使用不同的输入来获取哈希,从而在问题中获得所需的证书数据,实际上很难这样做。编写哈希算法是为了完全避免您想要实现的目标。要获得所需的输入,您可能需要花费大量的时间,空间和计算能力。
长答案详细了解哈希真正做的事情。
例如,对于问题中的SHA256,有22562256个可能的哈希值。如果您尝试了22552255个不同的输入,则有50%的可能性。即使你每微秒尝试一次,这也需要10631063年。这是实际难以实现的主要原因之一。
反转哈希就像试图从它们的总和猜测两个数字(x + y = 234)。有一个很多的可能组合。 有一些很棒的答案here