securestorage


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

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

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


사용 설정

Realm 설정

securestorage 는 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:10.15.1"
   }
}

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

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

Example

DAPSecureStorage.setNetworkDelegate(new INetworkDelegate() {
@Override
   public Object post(@NonNull NetworkDelegateParams params) {
        Network.Builder builder = Network.builder();

       // container 가 존재하면 구현해 두었던 DAPNetwork 를 통해 처리 하고
       if (params.container != null) {
           if (params.typeRef == null) {
               return DAPNetwork.doRequest(HoneMobileActivity.this,
                        DAPNetwork.METHOD_POST, params.container);
           } else {
               return DAPNetwork.doRequest(HoneMobileActivity.this,
                        DAPNetwork.METHOD_POST, params.container, params.typeRef);
           }
       } else {
           // 일단 url 로 호출했을 경우는 NetworkDelegate 를 통해 처리 한다.
           if (!TextUtils.isEmpty(params.url)) {
                builder.url(params.url);
           }

           if (params.forceDownload) {
                builder.forceDownload(true).retrieveDownloadPath();
           }

           if (params.multipartBody != null) {
                builder.multipartBody(params.multipartBody);
           }

            NetworkBase network = NetworkDelegate.get().net(HoneMobileActivity.this);

           return networkInternal(false, network, builder, params);
       }
   }

   @Override
   public void asyncPost(@NonNull NetworkDelegateParams params) {
        Network.Builder builder = Network.builder();

       if (params.container != null) {
           if (params.typeRef == null) {
                DAPNetwork.asyncDoPost(HoneMobileActivity.this, params.container,
                        params.successCallback, params.errorCallback);
           } else {
                DAPNetwork.asyncDoPost(HoneMobileActivity.this, params.container,
                        params.successCallback, params.errorCallback, params.typeRef);
           }
       } else {
           // 일단 url 로 호출했을 경우는 NetworkDelegate 를 통해 처리 한다.
           if (!TextUtils.isEmpty(params.url)) {
                builder.url(params.url);
           }

           if (params.forceDownload) {
                builder.forceDownload(true).retrieveDownloadPath();
           }

           if (params.multipartBody != null) {
                builder.multipartBody(params.multipartBody);
           }

            NetworkBase network = NetworkDelegate.get().net(HoneMobileActivity.this);

            Executors.newSingleThreadExecutor().execute(() -> networkInternal(true, network, builder, params));
       }
   }});

instance

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

초기화 완료 후 SecureObject에 담아 전달되며 아래의 클래스 형태로 구성되어 있으며 세부 내용은 하단을 참조한다.

SecureObjectClass Class

public final class SecureObject {
  public final Realm db;
  public final Serializable msgContainer;
}

CaptureParams

필드설명
db디비 객체
msgContainer데이터 컨테이너
  

Example

DAPSecureStorage.instance(this@MainActivity, {
   // TODO
}, {
   // TODO
}, true)
DAPSecureStorage.instance(MainActivity.this, result -> {
       // TODO
   }, e -> {
       // TODO
   }, true);

get

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

options

필드설명M/O
reaml디비 객체M
key키 값M
   

Example

DAPSecureStorage.instance(this@MainActivity, { secureObj ->
    DAPSecureStorage.get(this@MainActivity, secureObj.db, "key", { result ->
           // TODO
       }, {
           // TODO
       })
}, {
   // TODO
}, true)
DAPSecureStorage.instance(MainActivity.this, secureObj -> {
        DAPSecureStorage.get(MainActivity.this, secureObj.db, "key", result -> {
               // TODO
           }, e -> {
               // TODO
           });
   }, e -> {
       // TODO
   }, true);

set

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

options

필드설명M/O
reaml디비 객체M
key키 값M
value저장할 값M
   

Example

DAPSecureStorage.instance(this@MainActivity, { secureObj ->
    DAPSecureStorage.set(this@MainActivity, secureObj.db, "key", "value", { result ->
           // TODO
       }, {
           // TODO
       })
}, {
   // TODO
}, true)
DAPSecureStorage.instance(MainActivity.this, secureObj -> {
        DAPSecureStorage.set(MainActivity.this, secureObj.db, "key", "value", result -> {
               // TODO
           }, e -> {
               // TODO
           });
       }, e -> {
   }, true);

remove

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

options

필드설명M/O
reaml디비 객체M
key키 값M
   

Example

DAPSecureStorage.instance(this@MainActivity, { secureObj ->
    DAPSecureStorage.remove(this@MainActivity, secureObj.db, "key", { result ->
       // TODO
   }, {
       // TODO
   })
}, {
   // TODO
}, true)
DAPSecureStorage.instance(MainActivity.this, secureObj -> {
        DAPSecureStorage.remove(MainActivity.this, secureObj.db, "key", result -> {
               // TODO
           }, e -> {
               // TODO
           });
       }, e -> {
   }, true);

Error Code

CodeCauseComment
E11300파라메터 값이 잘못되어 있을 경우 
E11301전달된 액션 값이 알 수 없는 액션일 경우 
E11302키 값이 잘못되어 있을 경우
키 값이 63자 초과 입력 되었을 경우
 
E11303저장할 값이 잘못되어 있을 경우 
E11350실행 중 오류가 발생 되었을 경우 
E11351서버로 부터 전달받은 응답 메시지가 없는 경우 
E11352서버로 부터 전달받은 응답 메시지가 잘못되어 있는 경우
서버로 부터 전달받은 응답 메시지에 복호화 키값이 잘못되어 있는 경우
 
E11353초기화시 오류가 발생 되었을 경우 
E11354키 값이 존재하지 않는 경우 
E11399알 수없는 오류가 발생 되었을 경우