Proteja com senha um banco de dados SQLite. É possível?

88

Eu tenho que enfrentar um pequeno projeto novo. Terá cerca de 7 ou 9 tabelas, a maior delas crescerá a uma taxa máxima de 1000 linhas por mês.

Pensei no SQLite como meu banco de dados ... Mas vou precisar proteger o banco de dados caso alguém queira alterar os dados do banco de dados

Minha pergunta principal é:

É possível proteger com senha um banco de dados sqlite como você faria no acesso?

Que outro RDBMS você recomendaria para uma solução tão pequena?

O desenvolvimento seria em C #, mas estou procurando algo grátis.

Jhonny D. Cano -Leftware-
fonte
2
Você pode querer verificar SQLiteCrypt
Mike Buckbee,
Se você precisa bloquear / desbloquear o banco de dados frequentemente para depuração, experimente esta ferramenta goo.gl/12VnQd
Mangesh
Você pode encontrar a solução aqui insira a descrição do link aqui
Ishwar Rimal
Possível duplicata de SQLite com criptografia / proteção de senha
iammilind

Respostas:

72

Você pode proteger com senha um banco de dados SQLite3. Antes de fazer qualquer operação, defina a senha da seguinte forma.

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();

então da próxima vez você pode acessá-lo como

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

Isso não permitirá que nenhum editor de GUI visualize seus dados. Alguns editores podem descriptografar o banco de dados se você fornecer a senha. O algoritmo usado é RSA.

Posteriormente, se desejar alterar a senha, use

conn.ChangePassword("new_password");

Para redefinir ou remover a senha, use

conn.ChangePassword(String.Empty);
Mangesh
fonte
A única ferramenta gratuita que encontrei até agora que abre bancos de dados protegidos por senha como este é o SQLite2009 Pro detalhado nesta resposta .
JumpingJezza
Que idioma é este exemplo? Parece .NET?
pim
1
Tecnicamente, .NET é uma estrutura. C # é o idioma exibido aqui.
vapcguy
Além disso, você deve ter cuidado ao atualizar a string de conexão antes da próxima abertura cada vez que alterar a senha ou você pode acabar enfrentando erros: stackoverflow.com/questions/16030601/…
vapcguy
Observe que, sem a senha fornecida, Open () NÃO falhará em um banco de dados SQLite protegido por senha, como você esperaria! O que falha é qualquer operação subsequente de dados ou metadados nesse arquivo aberto.
Cristi S.
33

Você pode usar a criptografia interna do provedor sqlite .net (System.Data.SQLite). Veja mais detalhes em http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Para criptografar um banco de dados não criptografado existente ou para alterar a senha de um banco de dados criptografado , abra o banco de dados e use a função ChangePassword () de SQLiteConnection:

// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");

Para descriptografar uma chamada de banco de dados criptografada existenteChangePassword() com uma senha NULLou "":

// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);

Para abrir um banco de dados criptografado existente ou para criar um novo banco de dados criptografado, especifique uma senha ConnectionStringcomo mostrado no exemplo anterior ou chame a SetPassword()função antes de abrir um novo SQLiteConnection. As senhas especificadas no ConnectionStringdevem ser em texto não criptografado, mas as senhas fornecidas na SetPassword()função podem ser matrizes de bytes binários.

// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable

Por padrão, a palavra-chave ATTACH usará a mesma chave de criptografia do banco de dados principal ao anexar outro arquivo de banco de dados a uma conexão existente. Para alterar esse comportamento, você usa o modificador KEY da seguinte maneira:

Se você estiver anexando um banco de dados criptografado usando uma senha de texto não criptografado:

// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();

Para anexar um banco de dados criptografado usando uma senha binária:

// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();
Liron Levi
fonte
2
Esta resposta apenas com link é na verdade um exemplo claro de por que não fazemos respostas apenas com link no SO. O link real se foi; não existe mais. O único motivo de podermos ver o site é porque ele foi arquivado automaticamente por web.archive.org.
Hanlet Escaño
Ele não funciona mais, nenhuma função desse tipo encontrada nas versões mais recentes.
MindRoasterMir
12

Use SQLCipher, é uma extensão de código aberto para SQLite que fornece criptografia AES de 256 bits transparente de arquivos de banco de dados. http://sqlcipher.net

Avdaff
fonte
2
Que tal velocidade? Se eu usar o sqlcipher, ele reduzirá o desempenho?
TomSawyer
6

Você pode criptografar seu banco de dados SQLite com o addon SEE. Desta forma, você evita acesso / modificação não autorizada.

Citando a documentação do SQLite:

O SQLite Encryption Extension (SEE) é uma versão aprimorada do SQLite que criptografa arquivos de banco de dados usando AES de 128 ou 256 bits para ajudar a prevenir o acesso não autorizado ou modificação. Todo o arquivo do banco de dados é criptografado para que, para um observador externo, o arquivo do banco de dados pareça conter ruído branco. Não há nada que identifique o arquivo como um banco de dados SQLite.

Você pode encontrar mais informações sobre este addon neste link .

rogeriopvl
fonte
7
essa extensão também é um complemento pago para sqlite.
John Boker,
3

Uma opção seria o VistaDB . Eles permitem que bancos de dados (ou mesmo tabelas) sejam protegidos por senha (e opcionalmente criptografados).

Reed Copsey
fonte
1
Existem maneiras mais eficientes e gratuitas!
Sawan
1
@MSS Mas - como eu disse, a solução VistaDB tem algumas vantagens, incluindo criptografia separada em nível de tabela em vez de criptografia de conexão DB completa. Não conheço nenhuma outra opção nativa do .NET que faça isso. Ele também é gerenciado puro, ao contrário da maioria das outras opções - só porque não é gratuito não significa que existam opções mais eficientes ou melhores - depende totalmente dos requisitos de uso.
Reed Copsey de
3

Se você usar FluentNHibernate, poderá usar o seguinte código de configuração:

private ISessionFactory createSessionFactory()
{
    return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
            .ExposeConfiguration(this.buildSchema)
            .BuildSessionFactory();    
}

private void buildSchema(Configuration config)
{
        if (filename_not_exists == true)
        {
            new SchemaExport(config).Create(false, true);
        }
}    

O método UsingFileWithPassword (nome do arquivo, senha) criptografa um arquivo de banco de dados e define a senha.
Ele é executado apenas se o novo arquivo de banco de dados for criado. O antigo não criptografado falha quando é aberto com este método.

Bronek
fonte
2

Eu sei que esta é uma questão antiga, mas a solução simples não seria apenas proteger o arquivo no nível do sistema operacional? Apenas evite que os usuários acessem o arquivo e então eles não devem ser capazes de tocá-lo. Isso é apenas um palpite e não tenho certeza se essa é uma solução ideal.

David Price
fonte
2
Não tenho certeza se essa é uma boa solução, porque qualquer pessoa com um stick USB pode inicializar em outro sistema operacional e ler os arquivos.
nurettin de
Eu acho que é justo apontar, mas nesse caso desative o USB. Se algum tiver acesso físico à sua máquina, há muitas outras coisas que podem ser feitas.
David Price
Você deseja proteger os dados confidenciais para que apenas as outras coisas dêem errado.
tripleee
Com o banco de dados SQLite, isso NÃO é realmente possível. Você precisa que os usuários sejam capazes de ler E gravar nele, o que significa que a ACL da pasta onde o banco de dados SQLite reside deve permitir a eles essas permissões também. Você pode protegê-lo contra não usuários, permitindo apenas aos usuários reais a permissão para essa pasta, mas você ainda tem a "ameaça interna".
vapcguy
1

Por que você precisa criptografar o banco de dados? O usuário pode facilmente desmontar seu programa e descobrir a chave. Se você estiver criptografando-o para transferência de rede, considere usar PGP em vez de espremer uma camada de criptografia em uma camada de banco de dados.

Trever Fischer
fonte
6
A senha pode ser solicitada ao usuário na inicialização, de forma que nenhuma chave possa ser obtida desmontando o programa.
kgadek
1
Use o refletor Redgate ou ILSpy.
Zev Spitz,
4
Por que você colocaria a chave no programa? você não faria isso, gere uma chave a partir da senha do usuário e use-a, então você não precisa de nenhum segredo no seu código-fonte.
trampster