web-dev-qa-db-fra.com

Protéger par mot de passe une base de données SQLite. C'est possible?

Je dois faire face à un nouveau petit projet. Il aura environ 7 ou 9 tables, la plus grande d'entre elles augmentera d'un taux maximum de 1000 lignes par mois.

J'ai pensé à SQLite en tant que ma base de données ... Mais je devrai protéger la base de données au cas où quelqu'un voudrait modifier les données de la base de données

Ma question principale est:

Est-il possible de protéger par mot de passe une base de données sqlite comme vous le feriez avec un accès?

Quel autre SGBDR recommanderiez-vous pour une solution aussi petite?

Le développement serait sur C #, mais je cherche quelque chose de gratuit.

Vous pouvez protéger par mot de passe une base de données SQLite3. Avant toute opération, définissez le mot de passe comme suit.

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

alors la prochaine fois que vous pourrez y accéder comme

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

Cela n'autorisera aucun éditeur graphique à afficher vos données. Certains éditeurs peuvent déchiffrer la base de données si vous fournissez le mot de passe. L'algorithme utilisé est RSA.

Plus tard, si vous souhaitez changer le mot de passe, utilisez

conn.ChangePassword("new_password");

Pour réinitialiser ou supprimer le mot de passe, utilisez

conn.ChangePassword(String.Empty);
62
Mangesh

Vous pouvez utiliser le chiffrement intégré du fournisseur .net sqlite (System.Data.SQLite). Voir plus de détails sur http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Pour chiffrer une base de données existante non chiffrée ou pour changer le mot de passe d'une base de données chiffrée , ouvrez la base de données puis utilisez la fonction 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");

Pour décrypter une base de données chiffrée existante , appelez ChangePassword() avec un mot de passe NULL ou "":

// 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);

Pour ouvrir une base de données chiffrée existante ou pour créer une nouvelle base de données chiffrée, spécifiez un mot de passe dans le ConnectionString comme indiqué dans l'exemple précédent ou appelez la fonction SetPassword() avant d'ouvrir un nouveau compte SQLiteConnection. Les mots de passe spécifiés dans ConnectionString doivent être en clair, mais les mots de passe fournis dans la fonction SetPassword() peuvent être des tableaux d'octets binaires.

// 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

Par défaut, le mot clé ATTACH utilisera la même clé de cryptage que la base de données principale lors de la connexion d'un autre fichier de base de données à une connexion existante. Pour changer ce comportement, vous utilisez le modificateur KEY comme suit:

Si vous attachez une base de données cryptée à l'aide d'un mot de passe en clair:

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

Pour attacher une base de données cryptée à l'aide d'un mot de passe binaire:

// 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();
31
Liron Levi

Utilisez SQLCipher, une extension opensource pour SQLite qui fournit un chiffrement AES 256 bits transparent des fichiers de base de données. http://sqlcipher.net

12
Avdaff

Vous pouvez chiffrer votre base de données SQLite avec l'addon SEE. De cette façon, vous empêchez les accès/modifications non autorisés.

Citant la documentation SQLite:

SEE (SQLite Encryption Extension) est une version améliorée de SQLite qui crypte les fichiers de base de données à l'aide d'AES 128 bits ou 256 bits afin d'empêcher tout accès ou modification non autorisé. Le fichier de base de données entier est crypté de sorte que, pour un observateur extérieur, le fichier de base de données semble contenir du bruit blanc. Il n'y a rien qui identifie le fichier en tant que base de données SQLite.

Vous pouvez trouver plus d'informations sur cet addon dans ce lien .

5
rogeriopvl

Une option serait VistaDB . Ils permettent aux bases de données (ou même aux tables) d'être protégées par un mot de passe (et éventuellement cryptées).

3
Reed Copsey

pour votre question sur le mot de passe protégeant votre base de données sqlite, je ne pense pas que cela puisse être fait.

vous pouvez cependant le chiffrer, voici quelques informations à ce sujet:

http://sqlcrypt.com/

c'est 149 $ par plate-forme.

3
John Boker

Si vous utilisez FluentNHibernate, vous pouvez utiliser le code de configuration suivant:

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

Méthode UsingFileWithPassword (nom du fichier, mot de passe) chiffre un fichier de base de données et définit un mot de passe.
Il ne s'exécute que si le nouveau fichier de base de données est créé. L'ancien non chiffré échoue lorsqu'il est ouvert avec cette méthode.

3
Bronek

Je sais que c'est une vieille question, mais la solution simple ne serait-elle pas de simplement protéger le fichier au niveau du système d'exploitation? Empêchez les utilisateurs d’accéder au fichier. Ils ne devraient pas pouvoir le toucher. Ceci est juste une supposition et je ne suis pas sûr que ce soit une solution idéale.

2
David Price

Pourquoi avez-vous besoin de chiffrer la base de données? L'utilisateur peut facilement désassembler votre programme et déterminer la clé. Si vous le chiffrez pour le transfert réseau, envisagez d'utiliser PGP au lieu de compresser une couche de chiffrement dans une couche de base de données.

1
Trever Fischer