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);
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();
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
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 .
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).
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:
c'est 149 $ par plate-forme.
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.
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.
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.