디바이스의 데이터 암호화

모바일 디바이스에서 로컬 데이터 저장소의 암호화를 사용하려면 암호화 기능이 포함되도록 애플리케이션 업데이트를 수행하고 암호화된 데이터 저장소를 작성해야 합니다.

iOS 디바이스의 데이터 암호화

프로시저

  1. CocoaPods를 사용하여 암호화 기능을 얻으십시오.
    1. Podfile을 열고 다음 행을 추가하십시오.

      BEFORE(IMFData/CloudantToolkit 포함):

      pod 'IMFDataLocal/SQLCipher'
      AFTER (Cloudant Sync 포함):
      pod 'CDTDatastore/SQLCipher'
      자세한 정보는 CDTDatastore 암호화 문서를 참조하십시오.
    2. 다음 명령을 실행하여 애플리케이션에 종속성을 추가하십시오.
      pod install
  2. Swift 애플리케이션 내에서 암호화 기능을 사용하려면 애플리케이션의 연관 브릿징 헤더에 다음 가져오기를 추가하십시오. BEFORE (IMFData/CloudantToolkit 포함):
    #import <CloudantSync.h>
    #import <CloudantSyncEncryption.h>
    #import <CloudantToolkit/CloudantToolkit.h>
    #import <IMFData/IMFData.h> 
    AFTER(Cloudant Sync 포함):
    #import <CloudantSync.h>
    #import <CloudantSyncEncryption.h>
  3. 키 제공자로 암호화에 필요한 로컬 저장소를 초기화하십시오.
    경고: 데이터베이스를 작성한 후에 비밀번호를 변경하면 기존 데이터베이스를 복호화할 수 없으므로 오류가 발생합니다. 데이터베이스를 암호화한 후에는 비밀번호를 변경할 수 없습니다. 비밀번호를 변경하려면 데이터베이스를 삭제해야 합니다.
    BEFORE(IMFData/CloudantToolkit 포함):
    //Get reference to data manager
    IMFDataManager *manager = [IMFDataManager sharedInstance];
    NSString *name = @"automobiledb";
    NSError *error = nil;
    
    // Initalize a key provider
    id<CDTEncryptionKeyProvider> keyProvider = [CDTEncryptionKeychainProvider providerWithPassword: @"passw0rd" forIdentifier: @"identifier"];
    
    //Initialize local store
    CDTStore *localStore = [manager localStore: name withEncryptionKeyProvider: keyProvider error: &error];
    let manager = IMFDataManager.sharedInstance()
    let name = "automobiledb"
    
    let keyProvider = CDTEncryptionKeychainProvider(password: "passw0rd", forIdentifier: "identifier")
    var store:CDTStore?
    do {
        store = try manager.localStore(name, withEncryptionKeyProvider: keyProvider)
    } catch let error as NSError {
        // Handle error
    }
    AFTER(Cloudant Sync 포함):
    // Get reference to datastore manager
    CDTDatastoreManager *datastoreManager = existingDatastoreManager;
    NSString *name = @"automobiledb";
    NSError *error = nil;
    
    // Create KeyProvider
    id<CDTEncryptionKeyProvider> keyProvider = [CDTEncryptionKeychainProvider providerWithPassword: @"passw0rd" forIdentifier: @"identifier"];
    
    //Create local store
    CDTDatastore *datastore = [datastoreManager datastoreNamed:name withEncryptionKeyProvider:keyProvider error:&error];
    // Get reference to datastore manager
    let datastoreManager:CDTDatastoreManager = existingDatastoreManager
    let name:String  = "automobiledb"
    
    //Create local store
    var datastore:CDTDatastore?
    let keyProvider = CDTEncryptionKeychainProvider(password: "passw0rd", forIdentifier: "identifier")
    do{
        datastore = try datastoreManager.datastoreNamed(name, withEncryptionKeyProvider: keyProvider)
    }catch let error as NSError{
        // Handle error
    }
  4. 암호화된 로컬 저장소를 사용하여 데이터를 복제하는 경우 키 제공자로 CDTPullReplicationCDTPushReplication 메소드를 초기화해야 합니다.
    BEFORE(IMFData/CloudantToolkit 포함):
    //Get reference to data manager
    IMFDataManager *manager = [IMFDataManager sharedInstance];
    NSString *databaseName = @"automobiledb";
    
    // Initalize a key provider
    id<CDTEncryptionKeyProvider> keyProvider = [CDTEncryptionKeychainProvider providerWithPassword:@"password" forIdentifier:@"identifier"];
    
    // pull replication
    CDTPullReplication *pull = [manager pullReplicationForStore: databaseName withEncryptionKeyProvider: keyProvider];
    
    
    // push replication
    CDTPushReplication *push = [manager pushReplicationForStore: databaseName withEncryptionKeyProvider: keyProvider];
    //Get reference to data manager
    let manager = IMFDataManager.sharedInstance()
    let databaseName = "automobiledb"
    
    // Initalize a key provider
    let keyProvider = CDTEncryptionKeychainProvider(password: "password", forIdentifier: "identifier")
    
    // pull replication
    let pull:CDTPullReplication = manager.pullReplicationForStore(databaseName, withEncryptionKeyProvider: keyProvider)
    
    
    // push replication
    let push:CDTPushReplication = manager.pushReplicationForStore(databaseName, withEncryptionKeyProvider: keyProvider)
    AFTER (Cloudant Sync 포함):

    암호화된 데이터베이스를 사용하는 복제 시 암호화되지 않은 데이터베이스를 사용하는 복제를 변경할 필요가 없습니다.

Android

Android 디바이스의 데이터 암호화

Android 디바이스의 데이터를 암호화하려면 애플리케이션에 올바른 라이브러리를 포함하여 암호화 기능을 얻습니다. 그런 다음 데이터 암호화 및 복제에 필요한 로컬 저장소를 초기화할 수 있습니다.

프로시저

  1. 다음과 같이 build.gradle 파일에 Cloudant 툴킷 라이브러리를 종속성으로 추가하십시오. BEFORE(IMFData/CloudantToolkit 포함):
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile 'com.ibm.mobile.services:cloudant-toolkit-local:1.0.0'
    }
    AFTER (Cloudant Sync 포함):
    repositories {
        mavenLocal()
        maven { url "http://cloudant.github.io/cloudant-sync-eap/repository/" }
        mavenCentral()
    }
    
    dependencies {
        compile group: 'com.cloudant', name: 'cloudant-sync-datastore-core', version:'0.13.2'
        compile group: 'com.cloudant', name: 'cloudant-sync-datastore-android', version:'0.13.2'
        compile group: 'com.cloudant', name: 'cloudant-sync-datastore-android-encryption', version:'0.13.2'
    }
  2. Android v3.2용 SQLCipher .jar.so 2진 파일을 다운로드하고 애플리케이션의 앱 구조 내 적절한 폴더에 포함시키십시오.
    1. 라이브러리를 추가하십시오. Android 앱 디렉토리 아래의 jniLibs 폴더에 공유 라이브러리 파일 및 SQLCipher 아카이브를 추가하십시오.
    2. 앱의 assets 폴더에 필수 ICU 압축 파일을 추가하십시오.
    3. sqlcipher.jar을 파일 종속성으로 추가하십시오. Android 스튜디오의 앱 폴더 메뉴에서 모듈 설정 열기 아래의 종속성 탭을 선택하십시오.
  3. 키 제공자로 암호화에 필요한 로컬 저장소를 초기화하십시오.
    경고: 데이터베이스를 작성한 후에 비밀번호를 변경하면 기존 데이터베이스를 복호화할 수 없으므로 오류가 발생합니다. 데이터베이스를 암호화한 후에는 비밀번호를 변경할 수 없습니다. 비밀번호를 변경하려면 데이터베이스를 삭제해야 합니다.
    BEFORE(IMFData/CloudantToolkit 포함):Android
    // Get reference to DataManager
    DataManager manager = DataManager.getInstance();
    
    // Initalize a key provider
    KeyProvider keyProvider = new AndroidKeyProvider(getContext(),"password","identifier");
    
    // Create local store
    String databaseName = "automobiledb";
    Task<Store> storeTask = manager.localStore(databaseName, keyProvider);
    storeTask.continueWith(new Continuation<Store, Void >() {
        @Override
        public Void then(Task<Store> task) throws Exception {
            if (task.isFaulted()) {
                // Handle error
            } else {
                // Do something with Store
                Store store = task.getResult();
            }
            return null;
         }
    });
    AFTER(Cloudant Sync 포함):Android
    // Load SQLCipher libs
    SQLiteDatabase.loadLibs(context);
    
    // Create DatastoreManager
    File path = context.getDir("databasedir", Context.MODE_PRIVATE);
    DatastoreManager manager = new DatastoreManager(path.getAbsolutePath());
    
    // Create encrypted local store
    String name = "automobiledb";
    
    KeyProvider keyProvider = new AndroidKeyProvider(context,"passw0rd","identifier");
    Datastore datastore = manager.openDatastore(name, keyProvider);
  4. 암호화된 로컬 저장소를 사용하여 데이터를 복제하는 경우 pullReplicationForStore() 또는 pushReplicationForStore() 메소드에 KeyProvider 오브젝트를 전달해야 합니다.
    BEFORE(IMFData/CloudantToolkit 포함):Android
    //Get reference to data manager
    DataManager manager = DataManager.getInstance();
    String databaseName = "automobiledb";
    
    // Initalize a key provider
    KeyProvider keyProvider = new AndroidKeyProvider(getContext(),"password","identifier");
    
    // pull replication
    Task<PushReplication> pullTask = manager.pullReplicationForStore(databaseName, keyProvider);
    
    // push replication
    Task<PushReplication> pushTask = manager.pushReplicationForStore(databaseName, keyProvider);
    AFTER (Cloudant Sync 포함):

    암호화된 데이터베이스를 사용하는 복제 시 암호화되지 않은 데이터베이스를 사용하는 복제를 변경할 필요가 없습니다.