ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 주말동안 알아본 Secure Enclave
    앱등이에게 살충제를 뿌린다./iOS 2022. 1. 2. 23:29

    출처: https://www.andyibanez.com/posts/cryptokit-secure-enclave/

    Secure Enclave

    암호화 기능만을 수행하는 iOS(OS)에 완전히 독립된 하드웨어. 생체인식 기능이 탑재된 iPhone 5S부터 가능. 터치바 있는 맥북도 가능.

    Touch ID, Face ID 인식에 필요한 수학적 계산도 Secure Enclave에서 일어난다. Touch ID데이터, Face ID데이터가 Secure Enclave에 저장되는 것은 아님! iOS가 Touch ID, Face ID 데이터로 연산을 한 뒤 이 데이터를 가지고 Secure Enclave에 물어본다. 이거 맞아?? Yes라고 대답하면 디바이스의 잠금이 해제된다.

     

    Security Framework, Cryptokit 모두 Secure Enclave에 키를 저장할 수 있다.

    Secure Enclave는 키를 Import, Export하지 않기 때문에 다른 곳에서 생성한 키를 Secure Enclave에 저장할 수 없고, 반대로 Secure Enclave에서 빼가는 것도 불가능하다. 즉, Key를 생성한 디바이스에서만 암호화가 가능하다.

     

    iOS를 설치할 때, Secure Enclave가 리셋된다. 그래서 iOS를 재설치하면 Secure Enclave에 있는 키를 필요로 하는 작업을 할 수 없다.

    현재 Secure Enclave는 4MB의 저장공간을 갖고 있고, P256 ECC 키만 저장할 수 있다.

    CryptoKit and the Secure Enclave.

    Cryptokit에서는 SecureEnclave라는 enum을 제공한다.

    if SecureEnclave.isAvailable {
      // Secure Enclave is available.
    }
    
    

    SecureEnclave에서 생성한 키는 https://www.andyibanez.com/posts/common-cryptographic-operations-with-cryptokit/ 에서 사용하는 API를 동일하게 사용할 수 있다.

    let enclaveKeys = try! SecureEnclave.P256.KeyAgreement.PrivateKey()
    let dataRepresentation = enclaveKeys.dataRepresentation
    

    DataRepresentation을 이용하여 키체인 또는 파일형태로 데이터를 저장할수 있다.

    The Data Representation of A Private Key.

    PrivateKey는 Secure Enclave를 떠날 수 없다면서?

    우선 Secure Enclave에서 PrivateKey를 가져오는 방법을 생각해봐야 한다. 안그러면 사용할 때마다 일회용 Key Pair를 생성해야 할 테니깐. (놀랍게도, Cryptokit에서 Secure Enclave의 키를 삭제하는 방법을 찾지 못했다.)

    Secure Enclave에 저장된 키도 다른 Cryptokit의 키처럼 Data Representation을 가지고 있다. 하지만 Secure Enclave 키는 이 데이터가 Raw key를 의미하지는 않는다. Secure Enclave는 자신만 암호화에 사용할 수 있는 Encrypted block을 제공한다.

    The documentation states:

    Keys that you store in the Secure Enclave expose a raw representation as well, but in this case the data isn’t the raw key. Instead, the Secure Enclave exports an encrypted block that only the same Secure Enclave can later use to restore the key.

    이런 이유로 Private Key의 Data Representation을 이용한 Export가 불가능하다.

    다른 디바이스에서 Private Key의 Data Representation을 사용하여 키를 Load할 수 있지만, 이를 실제로 암호화에 사용하려면 작동하지 않음을 확인할 수 있다. 새로운 디바이스의 Secure Enclave에서 이를 사용할 수 없기 때문이다.

    CryptoKit, SecureEnclave, and Local Authentication

    SecureEnclave에는 사용자 인증 옵션과 키 접근에 관련된 다른 옵션들을 제공한다.

    그래서 non-secure enclave key에는 없는 API를 하나 갖고 있다.

    init(compactRepresentable:accessControl:authenticationContext:)
    

    사용예시

    import LocalAuthentication // For LAContext
    import Security // For SecAccessControl
    
    // ...
    
    let authContext = LAContext();
        
    let accessControl = SecAccessControlCreateWithFlags(
       kCFAllocatorDefault,
       kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
       [.privateKeyUsage, .userPresence, .biometryCurrentSet],
       nil
    )!;
        
    let privateKey = try! SecureEnclave.P256.KeyAgreement.PrivateKey(
      accessControl: accessControl,
      authenticationContext: authContext)
    

    CryptoKit and the Secure Enclave

    Keys that you store in the Secure Enclave expose a raw representation as well, but in this case the data isn’t the raw key. Instead, the Secure Enclave exports an encrypted block that only the same Secure Enclave can later use to restore the key.

Designed by Tistory.