Guia do desenvolvedor

Local Navigation

Segurança de bancos de dados SQLite

Seu banco de dados SQLite pode ter um dos seguintes níveis de segurança:

  • Nenhuma criptografia: Um arquivo de texto sem formatação que é acessível de qualquer aplicativo no smartphone.
  • Criptografia: Um arquivo criptografado que é acessível de qualquer aplicativo no smartphone.
  • Criptografia e proteção: Um arquivo criptografado que é acessível somente de aplicativos no smartphone que são assinados com a mesma chave de assinatura de código.
  • Proteção de conteúdo além de criptografia e proteção: Um arquivo criptografado e protegido que usa proteção de conteúdo para criptografar a chave principal do SQLite e fornecer proteção adicional quando o smartphone está bloqueado.

Os aplicativos com informações confidenciais devem usar bancos de dados criptografados e protegidos para impedir que outros aplicativos usem o método attach para acessá-los.

Não há nenhuma maneira de restringir o acesso a um banco de dados de texto sem formatação porque ele pode ser lido com operações de E/S de arquivo.

As seções a seguir descrevem cada um dos níveis de segurança.

Criptografia

A criptografia ajuda a impedir que alguém copie arquivos de um smartphone e os leia. O algoritmo usado para implementar a criptografia do SQLite é o AES 256.

Para transferir um banco de dados criptografado para outro smartphone, você deverá, primeiro, descriptografá-lo.

Um aplicativo pode abrir ou criar um banco de dados criptografado apenas quando o smartphone está desbloqueado. Se um banco de dados estiver aberto quando um smartphone for desbloqueado, o banco de dados continuará a ser legível e gravável.

A criptografia não impede que outros aplicativos no smartphone acessem seu banco de dados. Para restringir o acesso, você deve proteger seu banco de dados assinando-o com uma chave de assinatura de código.

O exemplo de código a seguir cria um banco de dados criptografado, mas não assinado. Ele cria um objeto DatabaseSecurityOptions chamado dbso que passa true como o único valor de parâmetro:

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();
}

Criptografia e proteção

Para restringir um banco de dados de forma que ele possa ser acessado somente pelo aplicativo do qual ele faz parte, você deve assinar o banco de dados com uma chave de assinatura de código. Para restringir o acesso a um aplicativo, você deve usar uma chave exclusiva gerada com o uso da ferramenta BlackBerry Signing Authority Tool. Essa assinatura é separada da assinatura de código que você cria para APIs controladas.

Também é possível usar a chave de assinatura de código para compartilhar o acesso ao banco de dados com outros aplicativos específicos. Quando vários aplicativos são assinados com a mesma chave, todos os aplicativos têm acesso ao banco de dados.

O exemplo de código a seguir criptografa e protege um banco de dados existente. Primeiro, o exemplo de código recupera a chave de assinatura de código de um arquivo chamado XYZ. Em seguida, ele criptografa e assina o banco de dados. Se o banco de dados já estiver criptografado, o método encrypt será encerrado cuidadosamente.

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

Proteção de conteúdo além de criptografia e proteção

A proteção de conteúdo criptografa chaves de criptografia de modo que elas fiquem inacessíveis quando o smartphone estiver bloqueado.

Mesmo quando um arquivo de banco de dados está criptografado, o nível máximo de proteção é obtido quando a proteção de conteúdo é ativada. Com a proteção de conteúdo, um aplicativo pode abrir ou pode criar um banco de dados criptografado somente quando o smartphone estiver desbloqueado.

Um banco de dados criptografado deve ser fechado o quanto antes. Uma conexão aberta de banco de dados pode estar suscetível a ataques de inicialização a frio.

Para obter mais informações sobre a proteção de conteúdo, consulte a Guia de segurança do BlackBerry Java SDK, disponível em www.blackberry.com/go/devguides.

Exemplo de código: Criando um banco de dados criptografado SQLite

Por padrão, os arquivos de banco de dados são armazenados em um cartão de memória. Se você usar BlackBerry Smartphone Simulator, talvez precise Simular um cartão de memória.

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();
      }
   }
}

Estas informações foram úteis? Gostaríamos de receber seus comentários.