SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Usando SQLCipher com Android


Como posso integrar perfeitamente o SQLCipher ao meu banco de dados não criptografado existente, para que meu aplicativo funcione normalmente, mas agora os bancos de dados são criptografados?

Você não. Entre outras coisas, você precisa ajustar sua interface do usuário para solicitar uma senha ao usuário e garantir que possa solicitar essa senha conforme necessário (por exemplo, o usuário retoma uma tarefa de alguma atividade "interna", não apenas quando o usuário executa seu aplicativo por meio de um ícone do iniciador).

gostaria de um pequeno tutorial sobre isso

Primeiro, não é assim que o Stack Overflow funciona.

Segundo, uma cobertura decente do SQLCipher para Android leva muito mais do que cabe em uma única resposta do Stack Overflow. Eu tenho um capítulo de 18 páginas sobre o assunto no meu livro, por exemplo. Essa resposta já é mais longa do que a grande maioria das perguntas do Android, e eu não culparia as pessoas por fechar essa pergunta como sendo muito ampla.

Como devo verificar se o banco de dados não está criptografado

Tente abri-lo usando as classes SQLCipher para Android com "" como a senha. Se for aberto com êxito, o banco de dados não será criptografado. Se isso falhar, o banco de dados está corrompido ou criptografado e, sem a senha correta, você não pode dizer a diferença.

como posso criptografá-lo?

A abordagem básica é:

  • Abra o banco de dados não criptografado

  • Use o ATTACH Instrução SQL para anexar um arquivo vazio para servir como o novo banco de dados criptografado, fornecendo a senha desejada e nomeando o banco de dados anexado como encrypted dentro de sua sessão de banco de dados

  • Execute o SELECT sqlcipher_export('encrypted') no banco de dados aberto (não criptografado), que exportará os dados do banco de dados não criptografado para o criptografado (com exceção da versão do esquema do banco de dados, que é tratada em etapas posteriores)

  • Chame getVersion() no banco de dados aberto (não criptografado) e mantenha esse valor por um pouco

  • Feche o banco de dados não criptografado

  • Abra o banco de dados criptografado, usando sua senha

  • Chame setVersion() no banco de dados criptografado, fornecendo o valor que você armazenou em getVersion() do banco de dados não criptografado

  • Feche o banco de dados criptografado

  • Se desejar, exclua o banco de dados não criptografado e renomeie o criptografado para o nome do não criptografado agora excluído, para que sua conversão pareça ocorrer no local

Este método utilitário implementa a abordagem acima:
  public static void encrypt(Context ctxt, String dbName,
                             String passphrase) throws IOException {
    File originalFile=ctxt.getDatabasePath(dbName);

    if (originalFile.exists()) {
      File newFile=
          File.createTempFile("sqlcipherutils", "tmp",
                              ctxt.getCacheDir());
      SQLiteDatabase db=
          SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(),
                                      "", null,
                                      SQLiteDatabase.OPEN_READWRITE);

      db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';",
                                  newFile.getAbsolutePath(), passphrase));
      db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
      db.rawExecSQL("DETACH DATABASE encrypted;");

      int version=db.getVersion();

      db.close();

      db=
          SQLiteDatabase.openDatabase(newFile.getAbsolutePath(),
                                      passphrase, null,
                                      SQLiteDatabase.OPEN_READWRITE);
      db.setVersion(version);
      db.close();

      originalFile.delete();
      newFile.renameTo(originalFile);
    }
  }

No interesse da divulgação completa, não tentei isso há algum tempo e, portanto, pode ser necessário fazer alguns ajustes.

Devo fazer isso apenas uma vez?

Só você pode responder isso, pois ninguém aqui vai saber muito sobre seu aplicativo.

Quando criptografo meu banco de dados não criptografado existente, o SQLCipher cria um novo banco de dados?

Sim.

Se sim, como devo gerenciar este novo?

Só você pode responder isso, pois ninguém aqui vai saber muito sobre seu aplicativo.

E o meu banco de dados antigo que não é criptografado? Ainda fica lá?

Sim, mas você pode excluí-lo se e quando terminar.