콘텐츠로 이동

Android DataSealing

  • DoveRunner Mobile App Security 버전 2.23.0.0부터 지원됩니다.
  • DataSealing은 현재 Android Native C/C++ (NDK)에서만 지원됩니다. 따라서 다른 프레임워크(예: Java/Kotlin, Unity, Flutter)에서는 기본적으로 사용할 수 없습니다. 대신, 이러한 프레임워크에서 Native C/C++와 연동할 수 있는 플러그인을 사용하는 경우에는 이 가이드를 따라 DataSealing을 적용할 수 있습니다.
  • 향후 업데이트를 통해 다양한 프레임워크를 지원하여 DataSealing의 서비스 풀을 확장할 예정입니다.

2. 프로젝트에 DataSealing 적용 방법

Section titled “2. 프로젝트에 DataSealing 적용 방법”

DataSealing은 추가 코딩 없이 바이너리 파일 데이터를 안전하게 암호화하고 저장하는 기능을 제공하며, 암호화된 데이터를 직접 읽고 사용할 수 있도록 합니다.

DataSealing은 네이티브 File I/O 함수와 네이티브 AssetManager 관련 함수를 지원하며, Java File I/O 및 Java AssetManager 관련 함수는 향후 버전에서 지원될 예정입니다.

앱에 DataSealing을 적용하기 위해 SDK나 라이브러리를 별도로 다운로드할 필요가 없으며, 몇 가지 규칙만 따르면 기존 코딩 방식을 그대로 적용할 수 있습니다.

APK에 포함된 asset 파일을 암호화하려면 하나의 규칙만 기억하면 됩니다. “assets” 폴더 하위에 “ASDP”라는 이름의 폴더를 생성하고, 암호화하고자 하는 모든 asset 파일을 이 폴더로 이동시키면 됩니다. “ASDP”에 있는 Assets는 실링 시 자동으로 암호화되고, 앱에서 AssetManager 관련 네이티브 함수를 사용할 때 자동으로 복호화됩니다.

image1.png

이전 예제 프로젝트에서는 4개의 asset 파일이 사용되었는데, ASDP 폴더에 추가된 my_asset1.bin과 my_asset2.dat 파일은 실링 단계에서 암호화되고, assets 폴더 바로 하위에 추가된 my_asset3.bin과 my_asset4.dat 파일은 암호화되지 않습니다.

이러한 암호화된 asset 파일들은 JNI 네이티브 코드에서 AssetManager 관련 네이티브 함수를 사용하면 DoveRunner Mobile App Security 로직 내부에서 자동으로 복호화됩니다. 사용 가능한 AssetManager 함수는 다음과 같습니다:

- AAssetManager_open
- AAsset_getBuffer
- AAsset_getLength
- AAsset_getLength64
- AAsset_getRemainingLength
- AAsset_getRemainingLength64
- AAsset_read
- AAsset_seek
- AAsset_seek64
- AAsset_close

암호화된 “my_asset1.bin” 파일을 사용하는 예제 코드를 살펴보겠습니다. (Null 체크와 Error 체크는 생략됨)

AAssetManager* am = AAssetManager_fromJava( env, AssetManager );
AAsset* asset = AAssetManager_open( am, "ASDP/my_asset1.bin", AASSET_MODE_UNKNOWN );
int fileSize = AAsset_getLength( asset );
unsigned char* buffer = ( unsigned char* )AAsset_getBuffer( asset );
memcpy( data_buffer, ( const void* )buffer, fileSize );
AAsset_close( asset );

asset 파일을 읽기 위해 사용되던 기존 코드와 다른 점은 없습니다. 이런 방식으로 asset 파일을 읽으면, memcpy가 실행되기 전 AAsset_getBuffer 단계에서 asset 파일 데이터의 복호화가 수행되고, buffer에는 원본 데이터가 담기게 됩니다.

일반 바이너리 파일 암호화 지원

Section titled “일반 바이너리 파일 암호화 지원”

앱이 실행되는 동안 동적으로 생성되는 바이너리 파일에도 암호화를 적용할 수 있습니다. 새로 생성하는 바이너리 파일의 이름 앞에 “ASDP_” 접두사를 추가하면, 파일에 데이터를 쓰고/읽는 과정에서 암호화 및 복호화가 자동으로 적용됩니다. 단, 이 암호화/복호화 과정은 바이너리 파일에 대해서만 작동하므로, “fopen” 함수 호출에 사용되는 mode 매개변수에 “b” 문자가 포함되어야 합니다. “b” 문자가 포함되지 않은 mode 매개변수로 파일을 열 경우 자동 암호화/복호화가 작동하지 않습니다.

암호화된 바이너리 파일을 처리하기 위해 사용 가능한 파일 I/O 함수는 다음과 같습니다:

- fopen
- fseek
- ftell
- fread
- fwrite
- fclose

다음은 일반적인 파일 생성 코드입니다. (Null 체크와 Error 체크는 생략됨) 파일명이 “ASDP_“로 시작하면 파일에 저장되는 모든 데이터가 암호화됩니다. 아래 코드에서는 ‘secure_data’라는 메모리 버퍼의 4K 바이트 데이터가 모두 저장되기 전에 암호화됩니다.

FILE* fp = fopen( "/files/ASDP_my_secure_data.bin", "wb" );
int len = fwrite( secure_data, 1, 4096, fp );
fclose( fp );

파일에서 데이터를 읽을 때도 동일한 규칙이 적용됩니다. 다음은 이전에 생성된 파일을 “rb” 모드로 열고 1024 오프셋에서 2K 바이트 데이터를 읽는 일반적인 파일 읽기 코드입니다. 버퍼에 읽힌 데이터는 자동으로 복호화되어 저장됩니다.

FILE* fp = fopen( "/files/ASDP_my_secure_data.bin", "rb");
char buffer[4096] = { 0x00, };
fseek( fp, 1024, SEEK_SET );
int len = fread( buffer, 1, 2048, fp );
fclose( fp );

DataSealing 사용 방법은 다음과 같이 요약할 수 있습니다.

android_data_sealing_2.png

3. DoveRunner Mobile App Security Developer Console에서 DataSealing 활성화 방법

Section titled “3. DoveRunner Mobile App Security Developer Console에서 DataSealing 활성화 방법”

Native_API 활성화 설정으로 DataSealing이 적용되면, 실링 시작 전에 다음과 같은 확인 창이 표시되며, 내용에 동의하면 앱에서 DataSealing 기능이 활성화되고 실링이 자동으로 재시작됩니다.

en_datasealing_popup.png

DataSealing의 가격 모델을 확인하고 싶다면 여기를 클릭하세요