2016-12-21 147 views
0

在我的應用程序中,我使用的是SecKeyGeneratePair來生成RSA密鑰對。發佈應用程序後,我開始注意到在使用此功能時偶爾會出現errSecInteractionNotAllowed錯誤(目前非常少見),至今只在iOS 10設備上出現。我不清楚爲什麼密鑰對生成失敗,或者我應該怎麼做才能解決這個問題。另外,我找不到任何關於密鑰對生成失敗的文檔。使用SecKeyGeneratePair在iOS中生成密鑰對失敗,errSecInteractionNotAllowed

這是我用來生成密鑰對代碼:

guard let access = SecAccessControlCreateWithFlags(nil, 
                 kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly, 
                 [], 
                 nil) else {throw Error(description: "Failed to create access control")} 

    let privateAttributes = [String(kSecAttrIsPermanent): true, 
          String(kSecAttrApplicationTag): keyTag + self.privateKeyExtension, 
          String(kSecAttrAccessControl): access] as [String : Any] 
    let publicAttributes = [String(kSecAttrIsPermanent): true, 
          String(kSecAttrApplicationTag): keyTag + self.publicKeyExtension] as [String : Any] 

    let pairAttributes = [String(kSecAttrKeyType): kSecAttrKeyTypeRSA, 
          String(kSecAttrKeySizeInBits): self.rsaKeySize, 
          String(kSecPublicKeyAttrs): publicAttributes, 
          String(kSecPrivateKeyAttrs): privateAttributes] as [String : Any] 
    var pubKey, privKey: SecKey? 
    let status = SecKeyGeneratePair(pairAttributes as CFDictionary, &pubKey, &privKey) 

此代碼後,我檢查了狀態,如果它不是errSecSuccess,我與狀態從返回的記錄錯誤功能。這是我注意到errSecInteractionNotAllowed錯誤的地方。 那麼,爲什麼密鑰對的生成或我可以做什麼來解決它?

感謝,

奧馬爾

回答

0

與蘋果的開發人員支持討論這個之後,這裏是解決方案:

let privateAttributes = [String(kSecAttrIsPermanent): true, 
           String(kSecAttrApplicationTag): keyTag + self.privateKeyExtension, 
           String(kSecAttrAccessible): kSecAttrAccessibleAlways] as [String : Any] 
     let publicAttributes = [String(kSecAttrIsPermanent): true, 
           String(kSecAttrApplicationTag): keyTag + self.publicKeyExtension, 
           String(kSecAttrAccessible): kSecAttrAccessibleAlways] as [String : Any] 

     let pairAttributes = [String(kSecAttrKeyType): kSecAttrKeyTypeRSA, 
           String(kSecAttrKeySizeInBits): self.rsaKeySize, 
           String(kSecPublicKeyAttrs): publicAttributes, 
           String(kSecPrivateKeyAttrs): privateAttributes] as [String : Any] 
     var pubKey, privKey: SecKey? 
     let status = SecKeyGeneratePair(pairAttributes as CFDictionary, &pubKey, &privKey) 

的重要組成部分,是kSecAttrAccessible,選擇從這個list符合您需求的價值。請注意,某些值會限制對KeyVault中密鑰的訪問。

1

兩個建議:

  1. 嘗試在其他保護類像kSecAttrAccessibleAlways添加到您的通話SecAccessControlCreateWithFlags和測試,如果仍然出現該問題。
  2. 進一步爲您的用例定義一個flag而不是傳遞一個空數組。例如。 userPresence

另外我偶然發現了這個SO post,也許你可以在那裏找到一些靈感。

+0

謝謝!事實上,這是通過與蘋果支持交流解決的。問題在於標誌的使用不正確 - 它應該作爲關鍵參數之一傳遞(在數組中)。 –

+0

嗨,奧梅爾,沒問題。我在調查iOS加密API時遇到了這個問題。一個問題:你的意思是'kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly'標誌嗎? 如果有某種討論和解決問題的論壇帖子,請在此處鏈接。也許它會在未來幫助別人;) –

+0

不,對不起 - 它使用蘋果技術支持,而不是公開的。我現在回答這個問題並將其標記爲答案。 –