SQLite avec cryptage / protection par mot de passe

136

J'apprends juste à utiliser SQLite et j'étais curieux de savoir si cela est possible:

  1. Chiffrement du fichier de base de données?

  2. Mot de passe protéger l'ouverture de la base de données?

PS. Je sais qu'il existe cette «extension de chiffrement SQLite (SEE)», mais selon la documentation, «Le SEE est un logiciel sous licence…» et «Le coût d'une licence de code source perpétuelle pour SEE est de 2000 $ US».

ahmd0
la source
C'est certainement possible et il existe plusieurs solutions open source en plus de SEE. Parmi eux, l'extension de cryptage fournie avec wxSQLite3. Voir ma réponse à une question similaire pour plus de détails.
Ulrich Telle
1
@RobotMess: Pour être honnête avec vous - aucun de ceux énumérés ici. J'avais des contraintes de temps strictes sur ce projet, alors j'ai dû faire quelque chose rapidement. Je suis allé avec ce que je savais le mieux - AES sur les données brutes avant de les placer dans la base de données ... Ce n'est pas très efficace en termes de recherche, de recherche et de gestion de base de données.
ahmd0
@ ahmd0 Hm, est-ce que cela ne rend pas la base de données inutile? Je veux dire, tout ce qu'il fait maintenant, c'est s'assurer que les commits sont atomiques.
Navin
Oui c'est possible. Si vous ciblez .Net Standard 4.6.1+ ou Core, je pense qu'un cryptage Sqlite assez simple consiste à utiliser Microsoft.Data.Sqlite selon ma réponse ici .
paulyb

Réponses:

110

SQLite a des hooks intégrés pour le cryptage qui ne sont pas utilisés dans la distribution normale, mais voici quelques implémentations que je connais:

  • VOIR - La mise en œuvre officielle.
  • wxSQLite - Un wrapper C ++ de style wxWidgets qui implémente également le chiffrement de SQLite.
  • SQLCipher - Utilise libcrypto d'openSSL pour implémenter.
  • SQLiteCrypt - Implémentation personnalisée, API modifiée.
  • botansqlite3 - botansqlite3 est un codec de cryptage pour SQLite3 qui peut utiliser n'importe quel algorithme de Botan pour le cryptage.
  • sqleet - une autre implémentation de chiffrement, utilisant les primitives ChaCha20 / Poly1305. Notez que wxSQLite mentionné ci-dessus peut l'utiliser comme fournisseur de crypto.

Le SEE et SQLiteCrypt nécessitent l'achat d'une licence.

Divulgation: j'ai créé botansqlite3.

OliJG
la source
1
Avez-vous une documentation sur l'utilisation de Botan pour le chiffrement de base de données SQLite? Le site Web de Botan ne mentionne pas cette fonctionnalité.
Marc Schlösser
5
botansqlite3 est maintenant distribué indépendamment de Botan.
OliJG
1
Il y a aussi litereplica . Il utilise le chiffrement ChaCha, plus rapide que AES sur les appareils portables basés sur ARMv7
Bernardo Ramos
SQLite3 .Net comme support intégré pour le chiffrement maintenant, ce qui invalide largement cette réponse.
Krythic
21

Vous pouvez protéger par mot de passe SQLite3 DB. Pour la première fois 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 ne permettra à aucun éditeur d'interface graphique de visualiser vos données. Plus tard, si vous souhaitez modifier le mot de passe, utilisez conn.ChangePassword("new_password"); Pour réinitialiser ou supprimer le mot de passe, utilisezconn.ChangePassword(String.Empty);

Mangesh
la source
16
Ne fonctionnera pas avec le Sqlite open source. Aucune idée de l'implémentation du langage, du langage ou de l'API que cela est censé être.
mikerobi du
1
Comment savoir quelle méthode de cryptage est ChangePasswordutilisée? AES 128? RSA ..?
qakmak
1
RSA 1024 ou 2048? Y a-t-il un document qui pourrait voir plus de détails?
qakmak
Obtenez la documentation à partir d'ici system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
Mangesh
Dans mes propres tests, j'ai trouvé que la SetPasswordméthode (pour le moment) semble fondamentalement inutile. La seule façon dont j'ai pu obtenir la System.Data.SQLitebibliothèque pour appliquer correctement le mot de passe était d'utiliser la ChangePasswordméthode. En utilisant SetPassword( avant d' appeler la Openméthode, comme cela est apparemment requis par la bibliothèque), je pouvais toujours ouvrir et modifier la base de données dans SQLiteStudio sans aucun mot de passe. Ce n'est que lorsque j'ai utilisé la ChangePasswordméthode ( après avoir appelé la Openméthode) que l'application de mot de passe s'est réellement "bloquée".
G_Hosa_Phat
15

La bibliothèque .net System.Data.SQLite assure également le chiffrement.

Rory
la source
8
ASP.NET! = SQL Server! = Instance installée de SQL Server
Zev Spitz
1
Mais System.Data.SQLite n'est pas de Microsoft. Cette question ne concerne pas .Net mais si c'était le cas, d'autres compatibilités et incompatibilités seraient importantes.
user34660
7

Vous pouvez obtenir un sqlite3.dllfichier avec prise en charge du chiffrement à partir de http://system.data.sqlite.org/ .

1 - Allez sur http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki et téléchargez l'un des packages. La version .NET n'est pas pertinente ici.

2 - Extrayez le SQLite.Interop.dllpackage et renommez-le en sqlite3.dll. Cette DLL prend en charge le cryptage via des mots de passe en clair ou des clés de cryptage.

Le fichier mentionné est natif et ne nécessite PAS de framework .NET. Il peut avoir besoin de Visual C ++ Runtime en fonction du package que vous avez téléchargé.

METTRE À JOUR

Voici le package que j'ai téléchargé pour le développement 32 bits: http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip

Mohammad Banisaeid
la source
Dans mon exemple particulier, j'avais besoin d'un .libque je pourrais intégrer dans mon exécutable. Je ne pouvais pas avoir de dll.
ahmd0
2
Veuillez également vérifier celui-ci github.com/rindeal/wxSQLite3-VS qui vous donnera un fichier libet dll.
Mohammad Banisaeid
4

Gardez à l'esprit que ce qui suit n'est pas destiné à remplacer une solution de sécurité appropriée.

Après avoir joué avec cela pendant quatre jours, j'ai mis en place une solution en utilisant uniquement le package open source System.Data.SQLite de NuGet. Je ne sais pas quelle protection cela offre. Je ne l'utilise que pour mon propre programme d'études. Cela créera la base de données, la chiffrera, créera une table et ajoutera des données.

using System.Data.SQLite;

namespace EncryptDB
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"C:\Programming\sqlite3\db.db";
            string passwordString = "password";
            byte[] passwordBytes = GetBytes(passwordString);
            SQLiteConnection.CreateFile(connectionString);
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
            conn.SetPassword(passwordBytes);
            conn.Open();
            SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
            sqlCmd.ExecuteNonQuery();
            sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
            sqlCmd.ExecuteNonQuery();
            conn.Close();
        }
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            bytes = System.Text.Encoding.Default.GetBytes(str);
            return bytes;
        }
    }
}

Vous pouvez éventuellement le supprimer conn.SetPassword(passwordBytes);et le remplacer par celui conn.ChangePassword("password");qui doit être placé après conn.Open();au lieu d’avant. Ensuite, vous n'aurez pas besoin de la méthode GetBytes.

Pour déchiffrer, il suffit de mettre le mot de passe dans votre chaîne de connexion avant l'appel à ouvrir.

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();
Mike Warner
la source
2
"I think I saw 128 bit somewhere"- c'est une très mauvaise déclaration si vous prévoyez de traiter le cryptage. La règle de base est que vous ne le faites jamais vous -même si vous ne le comprenez pas. Sinon, vous feriez mieux de ne pas l'utiliser du tout.
ahmd0
Je vois ce que tu veux dire. J'essayais principalement de corriger les conseils que je voyais qui ne fonctionnaient pas avec la version actuelle de System.Data.Sqlite. Je ne voulais pas dire que c'était une bonne sécurité. J'ai mis à jour mon message. Merci pour la contribution!
Mike Warner
2

Vous pouvez toujours crypter les données côté client. Veuillez noter que toutes les données ne doivent pas être cryptées car elles présentent un problème de performances.

Marcin
la source
1

Eh bien, SEEc'est cher. Cependant, il SQLitea une interface intégrée pour le cryptage (pager). Cela signifie qu'en plus du code existant, on peut facilement développer un mécanisme de cryptage, ce n'est pas nécessaire AES. Rien? Vraiment. S'il vous plaît voir mon message ici: https://stackoverflow.com/a/49161716/9418360

Vous devez définir SQLITE_HAS_CODEC = 1 pour activer le chiffrement du téléavertisseur. Exemple de code ci-dessous ( SQLitesource d' origine ):

#ifdef SQLITE_HAS_CODEC
/*
** This function is called by the wal module when writing page content
** into the log file.
**
** This function returns a pointer to a buffer containing the encrypted
** page content. If a malloc fails, this function may return NULL.
*/
SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
  void *aData = 0;
  CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
  return aData;
}
#endif

Il existe une version commerciale C languagepour le SQLitechiffrement en utilisant AES256 - il peut aussi travailler avec PHP, mais il doit être compilé avec PHPet l' SQLiteextension. Il dé / crypte le SQLitefichier de base de données à la volée, le contenu du fichier est toujours crypté. Très utile.

http://www.iqx7.com/products/sqlite-encryption

q74
la source
0

Vous pouvez utiliser les routines de création de fonctions de SQLite ( manuel PHP ):

$db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2);

Lors de l'insertion de données, vous pouvez utiliser la fonction de cryptage directement et INSÉRER les données cryptées ou vous pouvez utiliser la fonction personnalisée et transmettre des données non cryptées:

$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');

Lors de la récupération de données, vous pouvez également utiliser la fonctionnalité de recherche SQL:

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
Alien426
la source