Mot de passe Protégez une base de données SQLite. C'est possible?

88

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 comme ma base de données ... Mais je devrai protéger la base de données au cas où quelqu'un voudrait changer les données de la base de données

Ma principale question est:

Est-il possible de protéger par mot de passe une base de données sqlite comme vous le feriez lors de l'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.

Jhonny D. Cano -Leftware-
la source
2
Vous voudrez peut-être vérifier SQLiteCrypt
Mike Buckbee
Si vous avez besoin de verrouiller / déverrouiller fréquemment la base de données pour le débogage, essayez cet outil goo.gl/12VnQd
Mangesh
Vous pouvez trouver la solution ici entrez la description du lien ici
Ishwar Rimal
Possible duplication de SQLite avec cryptage / protection par mot de passe
iammilind

Réponses:

73

Vous pouvez protéger par mot de passe une base de données SQLite3. Avant d'effectuer 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();

puis la prochaine fois, vous pourrez y accéder comme

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

Cela n'autorisera aucun éditeur d'interface 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 modifier le mot de passe, utilisez

conn.ChangePassword("new_password");

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

conn.ChangePassword(String.Empty);
Mangesh
la source
Le seul outil gratuit que j'ai trouvé jusqu'à présent qui ouvrira des bases de données protégées par mot de passe comme celle-ci est SQLite2009 Pro détaillé dans cette réponse .
JumpingJezza
Quelle langue est cet exemple? Ressemble à .NET?
pim
1
Techniquement, .NET est un framework. C # est la langue affichée ici.
vapcguy
De plus, vous devez être prudent avec la mise à jour de la chaîne de connexion avant la prochaine ouverture à chaque fois que vous changez le mot de passe ou vous pouvez vous retrouver face à des erreurs: stackoverflow.com/questions/16030601
...
Notez que, sans mot de passe fourni, Open () n'échouera PAS sur une base de données SQLite protégée par mot de passe, comme vous vous en doutez! Ce qui échoue, c'est toute opération de données ou de métadonnées ultérieure sur ce fichier ouvert.
Cristi S.
33

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

Pour crypter une base de données non cryptée existante ou pour modifier le mot de passe d'une base de données crypté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échiffrer un appel de base de données chiffré existantChangePassword() avec un mot de passe 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);

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 ConnectionStringcomme indiqué dans l'exemple précédent, ou appelez la SetPassword()fonction avant d'en ouvrir une nouvelle SQLiteConnection. Les mots de passe spécifiés dans le ConnectionStringdoivent être en texte clair, mais les mots de passe fournis dans la SetPassword()fonction 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 chiffrement que la base de données principale lors de l'attachement d'un autre fichier de base de données à une connexion existante. Pour modifier ce comportement, vous utilisez le modificateur KEY comme suit:

Si vous attachez une base de données chiffrée à l'aide d'un mot de passe en texte 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 chiffré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();
Liron Levi
la source
2
Cette réponse de lien seulement est en fait un exemple clair de la raison pour laquelle nous ne faisons pas de réponses de lien seulement chez SO. Le lien réel a disparu; il n'existe plus. La seule raison pour laquelle nous pouvons voir le site est qu'il a été automatiquement archivé par web.archive.org.
Hanlet Escaño
Cela ne fonctionne plus, aucune fonction de ce type trouvée dans les dernières versions.
MindRoasterMir
12

Utilisez SQLCipher, c'est une extension open source pour SQLite qui fournit un cryptage AES transparent 256 bits des fichiers de base de données. http://sqlcipher.net

Avdaff
la source
1
Et la vitesse? Si j'utilise sqlcipher, cela réduira-t-il les performances?
TomSawyer
6

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

Citant la documentation SQLite:

L'extension de chiffrement SQLite (SEE) 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 pour empêcher tout accès ou modification non autorisés. L'ensemble du fichier de base de données est chiffré 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 comme une base de données SQLite.

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

rogeriopvl
la source
7
cette extension est également un addon payant à sqlite.
John Boker le
3

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

Reed Copsey
la source
1
Il existe des moyens plus efficaces et gratuits!
Sawan
1
@MSS Mais - comme je l'ai dit, la solution VistaDB présente certains avantages, notamment un cryptage séparé au niveau de la table au lieu d'un cryptage complet de la connexion DB. Je ne connais aucune autre option native .NET qui accomplit cela. Il est également purement géré, contrairement à la plupart des autres options - ce n'est pas parce que ce n'est pas gratuit qu'il existe des options plus efficaces ou meilleures - cela dépend entièrement des exigences d'utilisation.
Reed Copsey
3

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 le crypter cependant, voici quelques informations à ce sujet:

http://sqlcrypt.com/

c'est 149 $ par plateforme.

John Boker
la source
3

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

La méthode UsingFileWithPassword (nom de fichier, mot de passe) crypte un fichier de base de données et définit le 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.

Bronek
la source
2

Je sais que c'est une vieille question, mais la solution simple ne serait-elle pas simplement de protéger le fichier au niveau du système d'exploitation? Empêchez simplement les utilisateurs d'accéder au fichier et ils ne devraient pas pouvoir y toucher. Ce n'est qu'une supposition et je ne sais pas si c'est une solution idéale.

David Price
la source
2
Je ne suis pas sûr que ce soit une bonne solution car toute personne disposant d'une clé USB pourrait démarrer dans un autre système d'exploitation et lire les fichiers.
nurettin le
Je pense que c'est un point juste, mais dans ce cas, désactivez l'USB. Si certains ont un accès physique à votre machine, il y a beaucoup d'autres choses qui peuvent être faites.
David Price
Vous souhaitez protéger les données sensibles afin que seules ces autres choses tournent mal.
tripleee
Avec la base de données SQLite, ce n'est en fait PAS possible du tout. Vous avez besoin que les utilisateurs puissent à la fois y lire ET écrire, ce qui signifie que l'ACL du dossier dans lequel réside la base de données SQLite doit également leur accorder ces autorisations. Vous pouvez le sécuriser contre les non-utilisateurs en n'autorisant que l'autorisation des utilisateurs réels sur ce dossier, mais vous avez toujours la «menace interne».
vapcguy
1

Pourquoi avez-vous besoin de crypter la base de données? L'utilisateur pourrait facilement démonter votre programme et trouver la clé. Si vous le chiffrez pour le transfert réseau, envisagez d'utiliser PGP au lieu de presser une couche de chiffrement dans une couche de base de données.

Trever Fischer
la source
6
L'utilisateur pourrait être invité à entrer le mot de passe au démarrage, de sorte qu'aucune clé ne serait réalisable en démontant le programme.
kgadek
1
Utilisez Redgate Reflector ou ILSpy.
Zev Spitz le
4
Pourquoi mettriez-vous la clé dans le programme? vous ne feriez pas cela, générez une clé à partir du mot de passe des utilisateurs et utilisez-la, alors vous n'avez besoin d'aucun secret dans votre code source.
trampster