개발 가이드

Local Navigation

SQLite 데이터베이스의 보안

SQLite 데이터베이스는 다음 중 하나의 보안 수준을 가질 수 있습니다.

  • 암호화 없음: 스마트폰의 모든 프로그램에서 액세스할 수 있는 일반 텍스트 파일입니다.
  • 암호화: 스마트폰의 모든 프로그램에서 액세스할 수 있는 암호화된 파일입니다.
  • 암호화 및 보호: 같은 코드 서명 키로 서명된 스마트폰의 프로그램에서만 액세스할 수 있는 암호화된 파일입니다.
  • 암호화, 보호 및 콘텐츠 보호: SQLite 마스터 키를 암호화하고 스마트폰이 잠겨 있을 경우 추가적인 보호를 제공하기 위해 콘텐츠 보호를 사용하는 암호화되고 보호된 파일입니다.

중요한 정보를 포함하는 프로그램은 다른 프로그램에서 attach 메소드를 사용하여 이에 액세스하는 것을 방지하기 위해 암호화되고 보호된 데이터베이스를 사용해야 합니다.

일반 텍스트 데이터베이스는 파일 I/O 작업으로 읽을 수 있으므로 이에 액세스하는 것을 제한하는 방법은 없습니다.

다음 섹션에서는 각 보안 수준에 대해 설명합니다.

암호화

암호화를 하면 다른 사람이 스마트폰에서 파일을 복사하여 읽는 것을 방지할 수 있습니다. SQLite 암호화를 구현하는 데 사용한 알고리즘은 AES 256입니다.

암호화된 데이터베이스를 다른 스마트폰으로 전송하려면 먼저 암호를 해독해야 합니다.

프로그램은 스마트폰이 잠기지 않은 상태에서만 암호화된 데이터베이스를 열거나 만들 수 있습니다. 스마트폰이 잠길 때 열려 있던 데이터베이스는 계속해서 읽거나 쓸 수 있습니다.

암호화는 스마트폰의 다른 프로그램이 사용자의 데이터베이스에 액세스하지 못하도록 막지는 않습니다. 액세스를 제한하려면 코드 서명 키로 서명하여 데이터베이스를 보호해야 합니다.

다음 코드 샘플은 암호화되지만 서명되지 않은 데이터베이스를 생성합니다. 이는 true를 단일 매개 변수 값으로 전달하는 dbso라는 DatabaseSecurityOptions 객체를 생성합니다.

try
{
    URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
    "MyEncryptedDatabase.db");
    DatabaseSecurityOptions dbso = new DatabaseSecurityOptions(true);
    d = DatabaseFactory.create(myURI,dbso);
    d.close();
}
catch ( Exception e )
{
    System.out.println( e.getMessage() );
    e.printStackTrace();
}

암호화 및 보호

데이터베이스를 제한하여 일부 프로그램에서만 액세스할 수 있게 하려면 코드 서명 키로 데이터베이스에 서명해야 합니다. 단일 프로그램에 대한 액세스를 제한하려면 BlackBerry Signing Authority Tool을 사용하여 생성한 고유 키를 사용해야 합니다. 이 서명은 제어된 API에 코드 서명하는 것과는 별개입니다.

또한 코드 서명 키를 사용하여 다른 특정 프로그램과 데이터베이스에 대한 액세스를 공유할 수 있습니다. 여러 프로그램이 동일한 키로 서명된 경우 해당 프로그램 모두 데이터베이스에 액세스할 수 있습니다.

다음 코드 샘플은 기존 데이터베이스를 암호화 및 보호합니다. 먼저, 코드 샘플은 XYZ라는 파일에서 코드 서명 키를 읽어들입니다. 그런 다음, 데이터베이스를 암호화 및 서명합니다. 데이터베이스가 이미 암호화된 경우, encrypt 메소드는 알아서 종료합니다.

CodeSigningKey codeSigningKey = 
    CodeSigningKey.get(CodeModuleManager.getModuleHandle( "SQLiteDemo" ), "XYZ");
try
    {
    DatabaseFactory.encrypt(uri, new DatabaseSecurityOptions(codeSigningKey));
    }
    catch(DatabaseException dbe)
    {
    errorDialog("Encryption failed - " + dbe.toString());         
    }

암호화, 보호 및 콘텐츠 보호

콘텐츠 보호는 암호화 키를 암호화하여 스마트폰이 잠겨 있을 때 이에 액세스할 수 없도록 합니다.

하나의 데이터베이스 파일이 암호화되어 있더라도 콘텐츠 보호가 켜져 있으면 최고 수준의 보호가 설정됩니다. 콘텐츠 보호를 사용하면 스마트폰이 잠금 해제된 경우에만 프로그램에서 암호화된 데이터베이스를 열거나 만들 수 있습니다.

암호화된 데이터베이스는 가능한 한 빨리 닫아야 합니다. 열려 있는 데이터베이스 연결은 콜드 부팅 공격을 받기 쉽습니다.

콘텐츠 보호에 대한 자세한 내용을 보려면 BlackBerry Java SDK 보안 가이드(www.blackberry.com/go/devguides에서 제공)를 참조하십시오.

코드 샘플: 암호화된 SQLite 데이터베이스 생성

기본적으로 데이터베이스 파일은 미디어 카드에 저장됩니다. BlackBerry Smartphone Simulator를 사용하는 경우, 미디어 카드를 시뮬레이션해야 할 수도 있습니다.

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.database.*;
import net.rim.device.api.io.*;
public class CreateEncryptedDatabase extends UiApplication
{
   public static void main(String[] args)
   {
      CreateEncryptedDatabase theApp = new CreateEncryptedDatabase(); 
      theApp.enterEventDispatcher();
   }
   public CreateEncryptedDatabase()
   { 
      pushScreen(new CreateEncryptedDatabaseScreen());
   }
}
class CreateEncryptedDatabaseScreen extends MainScreen
{
   Database d; 
   public CreateEncryptedDatabaseScreen()
   {
      LabelField title = new LabelField("SQLite Create Encrypted Database Sample",
      LabelField.ELLIPSIS |
      LabelField.USE_ALL_WIDTH);
      setTitle(title);
      add(new RichTextField("Creating an encrypted database called " +
      "MyEncryptedDatabase.db on the microSD card."));
      try
      {
         URI myURI = URI.create("file:///SDCard/Databases/SQLite_Guide/" +
         "MyEncryptedDatabase.db");
         DatabaseSecurityOptions dbso = new DatabaseSecurityOptions(true);
         d = DatabaseFactory.create(myURI,dbso);
         d.close();
      }
      catch ( Exception e )
      {
         System.out.println( e.getMessage() );
         e.printStackTrace();
      }
   }
}

이 정보가 도움이 되었습니까? 의견을 보내 주십시오.