1. 데이터실링 지원 환경
- 앱실링 버전 2.23.0.0부터 지원합니다.
- 데이터 실링 기능은 현재 Android Native C/C++(NDK) 에서만 지원합니다. 따라서 다른 프레임워크(예: Java/Kotlin, Unity, Flutter) 에서는 기본적으로 이용이 가능하지 않습니다. 대신 이러한 프레임워크에서 Native C/C++와 연동할 수 있는 플러그인을 지원한다면 이를 통하여 Data Sealing 기능을 적용할 수 있습니다.
- 향후 업데이트를 통해 다양한 프레임워크들을 지원하여 데이터 실링의 서비스 풀을 늘려나갈 예정입니다.
2. 프로젝트에 데이터실링 적용하기
Data Sealing은 별도의 코딩 없이 바이너리 파일 데이터를 안전하게 암호화하여 저장하고 암호화된 데이터를 바로 읽어서 사용할 수 있는 기능입니다.
Data Sealing은 native File I/O 함수 및 native AssetManager 관련 함수를 지원하고 있으며 차후 버전에서는 Java File I/O 및 Java AssetManager 관련 함수를 지원할 예정입니다.
Data Sealing을 적용하기 위해 별도의 SDK나 라이브러리를 받을 필요가 없으며 몇 가지 규칙만 준수하면 기존의 코딩 방식 그대로 적용할 수 있습니다.
1) Assets 파일 암호화 지원
APK에 포함되는 asset 파일을 암호화 하려면 단 한가지 규칙만 기억하면 됩니다. assets 폴더 아래에 ASDP라는 폴더를 만들고 암호화 하려는 asset들을 모두 이 폴더로 이동하십시오. ASDP안의 asset들은 실링 시 자동으로 암호화 되고 앱에서 AssetManager 관련 함수들을 사용할 때 자동으로 복호화 될 것입니다.
위 예제 프로젝트의 경우 4개의 asset 파일이 사용되었는데 ASDP 폴더 안에 추가된 my_asset1.bin과 my_asset2.dat 파일은 실링 시에 암호화 되고 ASDP가 아닌 assets 폴더 바로 아래에 추가된 my_asset3.bin과 my_asset4.dat 파일은 암호화가 되지 않습니다.
이렇게 암호화 된 asset 파일은 JNI native code에서 기존의 AssetManager 관련 함수를 그대로 사용하면 내부에서 자동으로 복호화가 됩니다. 사용 가능한 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 단계에서 복호화가 수행되어 buffer에는 원본 데이터가 들어가 있게 됩니다.
2) 일반 바이너리 파일 암호화 지원
앱 실행 중에 동적으로 생성하는 바이너리 파일에도 암호화를 적용할 수 있습니다. 파일을 생성할 때 파일명 앞에 ASDP_ 라는 접두어를 붙이면 해당 파일에 데이터를 기록하고 읽어오는 과정에서 자동으로 암/복호화가 적용됩니다. 단 이러한 암/복호화 적용은 바이너리 파일에 대해서만 동작하기 때문에 fopen에 사용되는 mode 파라미터에 반드시 “b”문자가 포함되어 있어야 합니다. “b”가 포함되지 않은 mode로 파일을 열 경우 자동 암/복호화가 동작하지 않습니다.
암호화 된 바이너리 파일을 처리하기 위해 사용 가능한 File I/O 함수는 다음과 같습니다.
- fopen
- fseek
- ftell
- fread
- fwrite
- fclose
다음은 일반적인 파일 생성 코드입니다. (Null 체크 및 Error 체크는 생략됐습니다) 생성하는 파일 명이 “ASDP_” 로 시작할 경우 해당 파일에 저장되는 데이터는 모두 암호화 됩니다. 아래 코드에서는 secure_data라는 메모리 버퍼에 있는 4Kbyte의 데이터가 모두 암호화 돼서 저장될 것입니다.
FILE* fp = fopen( "/files/ASDP_my_secure_data.bin", "wb" );
int len = fwrite( secure_data, 1, 4096, fp );
fclose( fp );
파일에서 데이터를 읽어오는 경우도 마찬가지입니다. 다음은 일반적인 파일 읽기 코드로 앞에서 생성했던 파일을 “rb” 모드로 열어 1024 위치에서 2Kbyte의 데이터를 읽어 들이는 과정인데 buffer로 저장되는 데이터는 자동으로 복호화 되어 저장됩니다.
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 );
데이터 실링 기능 사용 방법은 다음과 같이 요약될 수 있습니다.
assets 암호화 | 프로젝트의 assets/ASDP 폴더에 암호화 할 파일들을 추가한다. |
데이터 파일 암호화 | 생성할 파일명이 “ASDP_”로 시작되어야 한다. |
AssetManager 사용 가능 함수 |
AAssetManager_open |
File IO 사용 가능 함수 |
fopen |
3. 데이터실링 ADC에서 활성화 하기
데이터실링을 Native_API 사용 설정으로 앱실링을 적용하면 실링이 시작되기 전에 다음과 같이 확인창이 출력되고, 내용에 동의하면 해당 앱에 데이터실링 기능이 활성화되고 실링이 다시 자동으로 시작됩니다.
4. 데이터실링 가격
데이터 실링의 비용이 궁금하다면 아래 문서를 확인해 주세요
https://helpcenter.appsealing.com/hc/ko/articles/900007739763