키체인 동기화 보안
사용자가 이중 인증 계정에서 iCloud 키체인을 처음으로 켜면, 기기는 자체 동기화 ID를 구축하고 생성합니다. 동기화 ID는 P-384를 사용하여 비대칭 타원형 키로 구성되며, 기기의 키체인에 저장됩니다. 각 기기는 사용자의 다른 기기의 동기화 ID 목록을 자체적으로 유지하며, 신원 키 중 하나를 사용하여 목록에 서명합니다. 이 목록은 CloudKit에 저장되어 사용자의 기기가 모든 사용자 기기에서 키체인 데이터를 안전하게 동기화하는 방법에 대한 합의에 도달할 수 있도록 합니다.
이전 iCloud 기기와의 호환성을 위해 비슷한 동기화 신뢰 서클이 생성되고, 다른 동기화 ID도 형성됩니다. 동기화 ID의 공개 키가 서클에 들어가면 서클은 두 번 서명됩니다. 먼저 동기화 ID의 개인 키로 서명된 다음 사용자의 iCloud 계정 암호에서 파생된 비대칭 타원형 키(P-256 사용)로 다시 서명됩니다. 또한 서클에 매개 변수(무작위 솔트 및 반복)가 저장되어 사용자의 iCloud 암호를 기반으로 하는 키를 생성하는 데 사용됩니다.
동기화 서클의 iCloud 저장 공간
이중 인증 계정의 경우, 각 기기의 신뢰하는 기기 목록이 CloudKit에 저장됩니다. 사용자의 iCloud 암호를 알지 못하면 목록을 읽을 수 없고 소유 기기의 개인 키가 없으면 수정할 수 없습니다.
마찬가지로, 서명된 동기화 서클은 사용자의 iCloud 키 값 저장 공간 영역에 저장됩니다. 사용자의 iCloud 암호를 알지 못하면 읽을 수 없고 해당 구성원의 동기화 ID의 개인 키가 없으면 유효하게 수정할 수 없습니다.
사용자의 다른 기기를 동기화 서클에 추가하는 방법
새 기기는 iCloud에 로그인하면서 iCloud 키체인 동기화 서클에 둘 중 한 방법으로 합류합니다. 기존의 iCloud 키체인 기기와 페어링하고 후원을 받거나 iCloud 키체인 복구를 사용합니다.
페어링 흐름 동안 신청 기기는 동기화 서클 및 동기화 목록(이중 인증 계정을 위해)을 위해 새로운 동기화 ID를 생성하고 후원자에게 제시합니다. 후원자는 동기화 서클에 신규 구성원의 공개 키를 추가하고 사용자의 iCloud 암호에서 파생된 키 및 동기화 ID로 다시 서명합니다. 새로운 동기화 서클은 iCloud에 저장되며, 여기에서 서클의 새로운 구성원이 비슷한 방식으로 서명을 합니다. 이중 인증 계정에서 후원자 기기는 연결된 기기에 ID 키로 서명된 증빙서도 제공하며 신청 기기를 신뢰할 수 있다는 사실을 보여줍니다. 그 다음 신뢰하는 동기화 ID의 개별 목록에 신청 기기를 포함하도록 업데이트합니다.
이제 서명 서클에 두 명의 구성원이 존재하게 되며 각 구성원은 상대의 공개 키를 가집니다. 그리고 상황에 따라 적절하게 CloudKit 또는 iCloud 키 값 저장 공간을 통해 개별 키체인 항목을 교환할 수 있습니다. 서클 구성원이 둘 다 같은 항목에 대한 업데이트가 있는 경우 둘 중 하나가 선택되어 결과적으로 일관성을 가집니다. 동기화된 각 항목은 암호화되고 사용자의 신뢰 서클 내 기기로만 암호화를 해제할 수 있으며, 다른 어떤 기기나 Apple을 통해서도 암호화를 해제할 수 없습니다.
새 기기가 동기화 서클에 합류하면 이 ‘합류 과정’이 반복됩니다. 예를 들어서 세 번째 기기가 합류하면 기존의 기기 둘 중 하나와 페어링이 가능합니다. 새로운 구성원이 추가되면 각 구성원은 새로운 구성원과 동기화합니다. 이를 통해 모든 구성원이 동일한 키체인 항목을 가질 수 있게 됩니다.
동기화되는 특정 항목
iMessage 키와 같은 일부 키체인 항목은 특정 기기에만 해당되기 때문에 기기에 남아야 합니다. 예기치 않은 데이터 전송을 방지하려면, 동기화되는 모든 항목은 kSecAttrSynchronizable
속성으로 확실하게 표시되어야 합니다.
Apple은 Wi-Fi 암호, HomeKit 암호화 키 및 종단간 iCloud 암호화를 지원하는 기타 키체인 항목뿐 아니라 Safari 사용자 데이터(사용자 이름, 암호 및 신용 카드 번호 포함)에 대해 이 속성을 설정합니다.
또한, 기본적으로 타사 앱에서 추가된 키체인 항목은 동기화하지 않습니다. 개발자는 키체인에 항목을 추가할 때 kSecAttrSynchronizable
속성을 설정해야 합니다.