SQLite avec cryptage/protection par mot de passe

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

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

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

PS. Je sais qu'il y a cette Extension de cryptage "SQLite" (voir).", mais selon la documentation, " Le SEE est un logiciel sous licence...."et" le coût d'un code source perpétuel la licence pour voir est de 2000 $US."

101
demandé sur ahmd0 2011-04-15 01:25:37

11 réponses

SQLite a des crochets 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 wxWidgets style C++ qui implémente également le cryptage de SQLite.
  • SQLCipher - utilise libcrypto d'openSSL pour implémenter.
  • SQLiteCrypt - application personnalisée, API modifiée.
  • botansqlite3 - botansqlite3 est un codec de cryptage pour SQLite3 qui peut utiliser tous les algorithmes de Botan pour le cryptage.
  • SQLiteCrypto - SQLiteCrypto est la Façon La plus Facile De Chiffrer une Base de données Sqlite Par AES-256 et SHA-256

Le VOIR, SQLiteCrypt et SQLiteCrypto exiger l'achat d'une licence.

divulgation: j'ai créé botansqlite3.

84
répondu OliJG 2018-01-27 00:41:20

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 pouvez y accéder comme

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

cela ne permettra pas à n'importe quel éditeur GUI de voir vos données. 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);

15
répondu Mangesh 2014-06-22 08:11:28

.net-library du Système.Données.SQLite fournit également le cryptage.

14
répondu Rory 2014-01-09 14:48:06

vous pouvez obtenir sqlite3.dll fichier avec support de cryptage de http://system.data.sqlite.org / .

1-Passez à http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki et télécharger un des paquets. La version. net n'est pas pertinente ici.

2-Extraire SQLite.Interop.dll de l'emballage et le renommer en sqlite3.dll . Cette DLL soutient le cryptage via des mots de passe en clair ou des clés de cryptage.

le fichier mentionné est natif et ne pas nécessite .net framework. Il peut avoir besoin de L'exécution de Visual C++ en fonction du paquet que vous avez téléchargé.

mise à JOUR

C'est le paquet 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

7
répondu Mohammad Banisaeid 2014-10-05 19:50:12

c'est certainement possible et il existe plusieurs solutions open source outre voir. Parmi eux, l'extension de cryptage avec wxSQLite3. voir ma réponse à une question similaire pour plus de détails.

3
répondu Ulrich Telle 2017-05-23 12:17:55

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 seulement le système open source.Données.Paquet SQLite de NuGet. Je ne sais pas combien de protection cela fournit. Je ne l'utilise que pour mes propres études. Cela créera la base de données, le chiffrer, créer une table, et ajouter 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;
        }
    }
}

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

pour décrypter, il suffit de mettre le mot de passe dans votre chaîne de connexion avant l'appel à l'ouverture.

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();
2
répondu Mike Warner 2015-10-16 19:08:09

vous pouvez toujours chiffrer les données du côté du client. Veuillez noter que toutes les données ne doivent pas être cryptées parce qu'elles ont un problème de performance.

1
répondu Marcin 2017-12-06 07:11:01

bien, SEE est cher. Cependant SQLite a 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, ne doit pas être AES . N'importe quoi vraiment. Veuillez voir mon post ici: https://stackoverflow.com/a/49161716/9418360

vous devez définir SQLITE_HAS_CODEC=1 pour activer le chiffrement du Pager. Code échantillon ci-dessous (original SQLite source:

#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 dans C language pour SQLite chiffrement utilisant AES256 - il peut également fonctionner avec PHP , mais il doit être compilé avec PHP et SQLite extension. Il de / encrypts SQLite fichier 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

1
répondu q74 2018-08-01 23:06:31

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 passer 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');
0
répondu Alien426 2016-02-22 06:35:25

Oui, c'est possible. Si le ciblage .net Standard 4.6.1+ ou Core, je pense qu'un assez simple pour obtenir le cryptage Sqlite est D'utiliser Microsoft.Données.Sqlite par ma réponse ici .

0
répondu paulyb 2018-03-31 16:06:42

pour les projets utilisant Javascript, le paquet écrit par journeyapps fonctionne parfaitement.

https://github.com/journeyapps/node-sqlcipher

il a travaillé sur Mac/Windows/Linux pour moi. Il compile SQLCipher sur votre plate-forme. Il n'est pas nécessaire de payer les licences de Zetetic.

0
répondu liangzan 2018-08-14 09:47:13