iOS에서 데이터 암호화 이해

iOS는 민감한 데이터를 보호하기 위해 여러 레이어에서 암호화를 구현합니다. 하드웨어 수준에서 Secure Enclave는 암호화 키와 암호화 작업을 관리합니다. 운영 체제 수준에서 Data Protection]는 장치의 암호로 ties decryption 키가 암호화되는 파일 수준 암호화를 사용합니다. 응용 특정 데이터의 경우, 개발자는 CryptoKit, CommonCrypto 및 보안 프레임 워크와 같은 프레임 워크를 활용하여 개별 레코드, 파일 또는 유료 네트워크로 암호화 할 수 있습니다.

암호화는 알고리즘과 키를 사용하여 일반 텍스트를 변환합니다. 올바른 키없이 데이터는 읽을 수 없습니다. Apple의 iOS Data Protection API는 파일을 복구하는 것을 자동으로 복원하지만 개발자는 Core Data, UserDefaults, custom caches와 같은 보호 파일 시스템에 저장된 데이터에 대한 명시적 암호화를 필요로합니다.

키 테이크아웃: ] 디바이스에 리사이드할 때마다 민감한 데이터를 암호화 ], 심지어 iOS 암호화가 기본적으로 활성화되는 경우. 이것은 물리적 장치 액세스, 법정 추출, 또는 같은 샌드박스에서 실행되는 악성 앱에 대한 보호를 보장합니다.

iOS 암호화 프레임 워크 및 API

Apple은 여러 암호화 라이브러리를 제공합니다. 올바른 선택은 배포 대상과 필요한 수준의 제어에 달려 있습니다.

CryptoKit - 현대 스위프트 API

iOS 13, CryptoKit에서 도입 된 비대칭 및 비대칭 암호화, 해싱 및 주요 합의를위한 스위프트 중립 인터페이스를 제공합니다. 그것은 [[FLT :0]]AES-GCM[[FLT :1]]를 사용하여 기밀성과 무결성을 모두 보호하는 암호화를 인증했습니다. 아래는 전형적인 암호화 및 해독 패턴입니다.

import CryptoKit

func encryptSensitiveData(_ plaintext: String, using key: SymmetricKey) throws -> Data {
 let inputData = Data(plaintext.utf8)
 let sealedBox = try AES.GCM.seal(inputData, using: key)
 return sealedBox.combined
}

func decryptSensitiveData(_ encryptedData: Data, using key: SymmetricKey) throws -> String {
 let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)
 let decryptedData = try AES.GCM.open(sealedBox, using: key)
 return String(decoding: decryptedData, as: UTF8.self)
}

항상 저장 키 체인에서, UserDefaults 또는 일반 파일에. 사용 장치와 사용자 존재에 키를 묶기 위해.

CommonCrypto – C 기반 유연성

오래된 iOS 버전 또는 사용자 정의 블록 저주 모드 (예 : HMAC가있는 CBC)를 지원하는 응용 프로그램에 대한, CommonCrypto는 낮은 수준의 C 기능을 제공합니다. 그것은 AES, DES, 3DES 및 다양한 해싱 알고리즘을 지원합니다. AES-CBC 암호화의 예 :

#include <CommonCrypto/CommonCryptor.h>

- (NSData *)aes256Encrypt:(NSData *)plaintext withKey:(NSData *)key iv:(NSData *)iv {
 size_t outLength;
 NSMutableData *ciphertext = [NSMutableData dataWithLength:plaintext.length + kCCBlockSizeAES128];
 CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
 key.bytes, key.length, iv.bytes,
 plaintext.bytes, plaintext.length,
 ciphertext.mutableBytes, ciphertext.length,
 &outLength);
 if (status == kCCSuccess) {
 ciphertext.length = outLength;
 return ciphertext;
 }
 return nil;
}

CommonCrypto는 초기화 벡터(IVs) 및 인증 태그의 수동 관리가 필요합니다. 인증된 암호화를 위해, AES-CBC를 별도의 HMAC로 설정하거나, CryptoKit을 통해 AES-GCM로 전환합니다.

보안 프레임 워크 및 키 체인

보안 프레임 워크는 키, 인증서 및 암호의 보안 스토리지에 대한 키 서비스를 제공합니다. ]를 사용하여 엄격한 액세스 제어 (예를 들어, 생체 인식을 통해 사용자 존재를 필요로) 키를 저장합니다. Secure Enclave는 ECC 작업에 대한 개인 키를 생성하고 저장 할 수 있으며 하드웨어를 결코 떠나지 않습니다.

다른 데이터 유형에 대한 암호화 구현

모든 데이터는 동일한 암호화 전략을 필요로하지 않습니다. 데이터가 사용되는 방법 및 방법의 접근 방식을 맞춤화하십시오.

사용자 기본값 및 Core Data 암호화

UserDefaults 및 Core Data store는 암호화되지 않는 일반 SQLite 파일입니다. Core Data를 위해서는 저장 파일에 NSFileProtectionType] 속성을 활성화합니다. 정밀한 과립성을 위해, 저장하기 전에 개별 속성 또는 전체 개체를 암호화합니다.

  • Core Data transformable 속성을 사용하여 암호화/암호화를 읽거나 쓰기.
  • JSON으로 전체 관리 객체를 직렬화, 암호화, 그리고 바이너리 속성에 ciphertext를 저장.
  • UserDefaults의 경우, 원시 민감한 문자열을 저장하지 마십시오. 각 값을 암호화하고 암호화된 데이터를 저장합니다.

UserDefaults에서 암호화된 데이터를 저장하는 예:

let key = SymmetricKey(size: .bits256)
let data = "user_ssn".data(using: .utf8)!
let sealedBox = try AES.GCM.seal(data, using: key)
UserDefaults.standard.set(sealedBox.combined, forKey: "encrypted_ssn")
UserDefaults.standard.synchronize()

파일 보호로 파일 암호화

iOS는 파일 수준의 보호 클래스를 제공합니다 : , , 및 ]. 생성하거나 이동하는 파일을 만들 때 이러한 속성을 설정:

let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)

데이터가 잠금 해제되면 보호해야 할 경우 명시된 암호화와 함께 파일 보호. 예를 들어, 키 체인에 저장 된 키와 접근 가능한 한 파일을 암호화하여 인증 후.

Network Data 암호화 (Transport Layer Security)

앱 전송 보안 (ATS)은 기본적으로 HTTPS를 시행합니다. 사용자 정의 TCP 연결, 사용 TLS와 함께 또는 SSL 핀을 구현하여 남자 -에서 - 중간 공격을 방지합니다. 추가 방어 - 심도에 대한 응용 층에서 페이로드를 암호화하십시오. TLS가 손상되면 데이터가 보호됩니다.

핵심 관리 모범 사례

암호화는 키 관리만큼 강력합니다. 보안을 유지하기 위해 이러한 지침을 따르십시오.

  • 암호화 수 발생기]를 사용하여 키 생성 또는 ].
  • ]키는 키만에 저장]를 적절한 접근성 속성으로 저장합니다. 는 백업을 방지하고 장치에 키를 ties합니다.
  • 바이오 메트릭 또는 패스코드 인증 키를 검색하기 전에 ] ]] 의 유저 검증을 강제로 한다.
  • 일정에 키를 올리거나 보안 이벤트 후 – 새로운 키와 데이터를 암호화하고 오래된 키를 안전하게 삭제합니다.
  • ]소스 코드 또는 구성 파일에서 키]를 하드코딩하지 않습니다. 필요한 경우 느린 키 디바이테이션 기능(PBKDF2 또는 scrypt)를 사용하여 사용자 암호에서 실행되는 키입니다.
  • Secure Enclave의 비대칭 키 생성에 대한 제한적 인 키는 내보낼 수 없으며, 여과를 방지합니다.

앱은 매우 민감한 데이터를 처리하기 위해 ]hardware 보안 모듈 (HSM) 네트워크 서비스를 통해, 그 후속을 도입하고 인터넷 연결을 필요로하는.

키 교체 및 재 암호화

키가 타협되거나 정의 된 기간 (예를 들어, 모든 90 일) 후, 키를 회전. 이것은 새로운 키 생성, 새로운 키 생성, 재 암호화를 모든 데이터를 해독합니다. 큰 데이터 세트를 위해, 버전 키 계획을 구현 :

  1. 각 암호화된 기록과 함께 키 식별자(예, UUID)를 저장합니다.
  2. 키체인의 실제 키로 식별자의 매핑을 유지 (잠금 해제).
  3. 교체 중에 즉시 모든 데이터를 암호화하지 않고 새로운 항목을 추가하십시오. 액세스시 암호화 lazily.

규정 및 규정 고려사항

민감한 데이터에 대한 많은 규정 위임 암호화. GDPR] 적절한 기술적 인 측정을 필요로하고 암호화는 인식 된 의사 결정 기술입니다. HIPAA]는 나머지와 transit에서 ePHI의 암호화를 위임합니다. PCI DSS는 카드 홀더 데이터의 암호화를 요구합니다. iOS, Apple Data의 규정 준수, 보안 및 보안 준수에 대한 가장 중요한 정책.

최신 권고에 대한 공식 Apple 문서에 대한 참조 : [[FLT :0]]CryptoKit Developer Guide[[FLT :1]], [[FLT :2]]Keychain Services[FLT :3], [[FLT :4]]Protecting User Privacy]. 산업 안내를 위해 ]OWASP Mobile Security Testing Guide[FLT :7] 및 [LT :7][LT :7]] [LT :8]]] [LT : 8175]] [FLT : 8]]] [FLT : 8]]].

시험 및 검증

암호화를 구현한 후, 올바르게 작동해야 합니다:

  • 암호화 및 암호로 식별하는 유니코드를 작성하고 출력을 증명합니다.
  • 시험 가장자리 상자: 빈 자료, 아주 큰 탑재량 및 손상된 ciphertexts.
  • 탈옥 장치를 사용하여 보안 테스트를 수행하여 공격 시나리오를 시뮬레이션합니다. 키가 인증없이 액세스 할 수 있음을 확인합니다.
  • static 분석 도구를 사용하여 하드 코딩 키 또는 약한 알고리즘을 보장하십시오.
  • 리뷰 로그 – 일반 텍스트 민감한 데이터 또는 암호화 키를 절대로 로그하지 않습니다.

관련 기사

iOS 데이터 저장에 대한 데이터 암호화를 구현하는 것은 다층 처리입니다. iOS 파일 보호, CryptoKit 또는 CommonCrypto와 애플리케이션 레이어 암호화를 결합하여 키 체인과 보안 Enclave를 통해 엄격한 키 관리는 개발자가 데이터 노출의 위험을 크게 줄일 수 있습니다. GDPR 및 HIPAA와 같은 규정 준수는 문서화, 감사 가능한 암호화 관행을 요구합니다. 정기 테스트 및 키 교체는 장기 보안을 보장합니다. 사용자 데이터뿐만 아니라 신뢰할 수 있고 기대를 충족하지 않는 강력한 암호화 아키텍처를 투자하십시오.