Secure Storage


Secure Storage는 3.1.1 버전 이상 부터 제공되며 해당 라이브러리를 추가하여 사용해야 된다.

Secure Storage 는 HSP 에서 확장 라이브러리로 제공하는 API 로 aar 라이브러리 파일과 build.gradle 파일을 수정한 뒤 Realm 와 Network 관련 설정을 하게 되면 사용할 수 있다.

라이브러리 추가 방법은 Android 개발 가이드의 내용을 참조하면 되며 Realm 과 관련된 설정은 하단을 참고 한다.


사용 설정

Realm 설정

Secure Storage 는 ORM 디비인 Realm 이용하고 있으며 이와 관련되어 필요한 설정을 설명 한다.

(Realm 의 자세한 설정을 정보를 원하면 https://realm.io/kr/docs/java/latest/  를 참조한다.)

먼저 Project Level 의 build.gradle 파일내 dependencies 에 realm 의 classpath 를 추가 한 뒤

buildscript {
    repositories {
        jcenter()
   }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:3.5.0"
   }
}

App Level 의 build.gradle 파일내 apply plugin: 'com.android.application' 하단에 아래의 코드를 추가 한다.

apply plugin: 'realm-android'

이후 Application 을 상속 받은 MainApp 의 onCreate 에 Secure Storage 의 init 을 추가하면 Realm 관련 설정이 완료된다.

public class MainApp extends Application {
   @Override
   public void onCreate() {
       super.onCreate();

        DAPSecureStorage.init(this);
        HoneMobile.get().setContext(this);
   }
}

INetworkDelegate

3.3.6 버전 이상 부터는 INetworkDelegate 를 HoneMobileActivity 에서 설정하기 때문에 사용자가 해당 내용을 구현하지 않아도 된다.

Secure Storage 는 디비 암호화를 위해 AES / RSA 를 이용하고 있고 이와 관련된 키 값을 얻기 위해 Operation 과 연동 작업이 이루어져야 한다. 이를 위해 NetworkDelegate 가 필요 하며 그에 대한 예제는 아래와 같다.

Example

DAPSecureStorage.setNetworkDelegate(new INetworkDelegate() {
   @Override
   public void request(@NonNull Map<String, Object> context, @NonNull Map<String, Object> message, @NonNull OnResultListener<Object> listener) {
        Map<String, Object> paramsMap = MapUtils.newNetworkParams(context, message);

        OnResultListener<MessageContainer> resListener = (result, msgContainer) -> {
       switch (result) {
           case OnResultListener.TRUE:
                listener.onResult(result, msgContainer.getMessage().getPayload());
               break;
           default:
                listener.onResult(result, msgContainer);
               break;
           }
       };

        DAPNetwork.asyncDoRequest(activity, paramsMap, resListener);
   }

   @Override
   public void download(@NonNull Map<String, Object> context, @NonNull OnResultListener<Object> listener) {

   }
});

instance

instance 는 디비를 초기화 하기 위한 준비 작업으로 암호화 관련 정보를 전달 받은 후 Realm 디비를 초기화 하는 과정이다.

Example

// 3.10.18 이상
DAPSecureStorage.instance(activity, {
   // TODO
}, {
   // TODO
}, true)

// 3.10.18 이하
DAPSecureStorage.instance({ result, secureObj ->
   // TODO
}, true)
// 3.10.18 이상
DAPSecureStorage.instance(activity, result -> {
       // TODO
   }, e -> {
       // TODO
   }, true);

// 3.10.18 이하
DAPSecureStorage.instance((result, secureObj) -> {
   // TODO
}, true);

get

get 은 키를 기준으로 저장된 데이터를 얻을 수 있다. (복호화된 값을 얻는다.)

Example

// 3.10.18 이상
DAPSecureStorage.instance(activity, { secureObj ->
    DAPSecureStorage.get(activity, secureObj.db, "key", { result ->
           // TODO
       }, {
           // TODO
       })
   }, {
       // TODO
   }, true)

// 3.10.18 이하
DAPSecureStorage.instance({ result, secureObj ->
   if (result == OnResultListener.TRUE) {
        val data = DAPSecureStorage.get(secureObj.db, "key")
       // TODO
   }
}, true)
// 3.10.18 이상
DAPSecureStorage.instance(activity, secureObj -> {
        DAPSecureStorage.get(activity, secureObj.db, "key", result -> {
               // TODO
           }, e -> {
               // TODO
           });
   }, e -> {
       // TODO
   }, true);

// 3.10.18 이하
DAPSecureStorage.instance((result, secureObj) -> {
   if (result == OnResultListener.TRUE) {
        SecureData data = DAPSecureStorage.get(secureObj.db, "key");
       // TODO
   }
}, true);

set

set 은 키를 기준으로 데이터를 저장한다. 이때 데이터는 암호화 되어 저장된다.

Example

// 3.10.18 이상
DAPSecureStorage.instance(activity, { secureObj ->
    DAPSecureStorage.set(activity, secureObj.db, "key", "value", { result ->
           // TODO
       }, {
           // TODO
       })
   }, {
   // TODO
}, true)

// 3.10.18 이하
DAPSecureStorage.instance({ result, secureObj ->
   if (result == OnResultListener.TRUE) {
        val data = DAPSecureStorage.get(secureObj.db, "key")
       // TODO
   }
}, true)
// 3.10.18 이상
DAPSecureStorage.instance(activity, secureObj -> {
        DAPSecureStorage.set(activity, secureObj.db, "key", "value", result -> {
               // TODO
           }, e -> {
               // TODO
           });
       }, e -> {
   }, true);

// 3.10.18 이하
DAPSecureStorage.instance((result, secureObj) -> {
   if (result == OnResultListener.TRUE) {
        SecureData data = DAPSecureStorage.get(secureObj.db, "key");
       // TODO
   }
}, true);

remove

remove는 키를 기준으로 데이터를 삭제한다.

Example

// 3.10.18 이상
DAPSecureStorage.instance(activity, { secureObj ->
    DAPSecureStorage.remove(activity, secureObj.db, "key", { result ->
       // TODO
   }, {
       // TODO
   })
}, {
   // TODO
}, true)

// 3.10.18 이하
DAPSecureStorage.instance({ result, secureObj ->
   if (result == OnResultListener.TRUE) {
        val data = DAPSecureStorage.remove(secureObj.db, "key")
       // TODO
   }
}, true)
// 3.10.18 이상
DAPSecureStorage.instance(activity, secureObj -> {
        DAPSecureStorage.remove(activity, secureObj.db, "key", result -> {
               // TODO
           }, e -> {
               // TODO
           });
       }, e -> {
   }, true);

// 3.10.18 이하
DAPSecureStorage.instance((result, secureObj) -> {
   if (result == OnResultListener.TRUE) {
        DAPSecureStorage.remove(secureObj.db, "key");
   }
}, true);