web-dev-qa-db-fra.com

SQLite avec cryptage/protection par mot de passe

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 SQLite Encryption (SEE)", mais selon la documentation, "Le SEE est un logiciel sous licence ...." et "Le coût d'une licence de code source perpétuel pour SEE est de 2 000 USD."

108
ahmd0

SQLite a des crochets intégrés pour le chiffrement 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 la bibliothèque libcrypto d'openSSL pour la mise en œuvre.
  • SQLiteCrypt - Implémentation personnalisée, API modifiée.
  • botansqlite3 - botansqlite3 est un codec de chiffrement pour SQLite3 pouvant utiliser n'importe quel algorithme de Botan pour le chiffrement.
  • SQLiteCrypto - SQLiteCrypto est le moyen le plus simple de chiffrer une base de données SQLite par AES-256 et SHA-256 

SEE, SQLiteCrypt et SQLiteCrypto nécessitent l’achat d’une licence.

Divulgation: J'ai créé botansqlite3.

90
OliJG

Vous pouvez protéger par mot de passe SQLite3 DB . Pour la première fois 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();

Ceci n'autorisera aucun éditeur graphique à afficher 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);

16
Mangesh

La bibliothèque .net System.Data.SQLite fournit également un cryptage. 

14
Rory

Vous pouvez obtenir le fichier sqlite3.dll avec prise en charge du chiffrement auprès de http://system.data.sqlite.org/

1 - Allez à 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 SQLite.Interop.dll du paquet et renommez-le en sqlite3.dll. Ce DLL prend en charge le cryptage via des mots de passe en texte clair ou des clés de cryptage.

Le fichier mentionné est natif et NOT requiert le framework .NET. Cela peut nécessiter 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 *: français

7

C'est certainement possible et il existe plusieurs solutions open source en plus de SEE. Parmi eux l'extension de cryptage venant avec wxSQLite3. Voir ma réponse à une question similaire pour plus de détails.

3
Ulrich Telle

N'oubliez pas que les éléments suivants ne sont pas destinés à remplacer une solution de sécurité appropriée.

Après avoir joué avec cela pendant quatre jours, j'ai mis au point une solution utilisant uniquement le package open source System.Data.SQLite de NuGet. Je ne sais pas combien de protection cela fournit. Je ne l'utilise que pour mon propre programme d'études. Cela va créer la base de données, la 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;
        }
    }
}

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

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

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();
3
Mike Warner

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

2
Marcin

SEE est cher. Cependant, SQLite a une interface intégrée pour le cryptage (Pager). Cela signifie que, en plus du code existant, on peut facilement développer un mécanisme de cryptage, ne doit pas nécessairement être AES. Quelque chose de vraiment . S'il vous plaît voir mon post ici: https://stackoverflow.com/a/49161716/9418360

Vous devez définir SQLITE_HAS_CODEC = 1 pour activer le cryptage Pager. Exemple de code ci-dessous (source SQLite 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 dans C language pour le chiffrement SQLite à l'aide de AES256 - elle peut également fonctionner avec PHP, mais elle doit être compilée avec les extensions PHP et SQLite. Il déchiffre le fichier de base de données SQLite à la volée, le contenu du fichier est toujours crypté. Très utile.

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

1
q74

Oui c'est possible. Si vous ciblez .Net Standard 4.6.1+ ou Core, je pense qu’il est assez simple d’obtenir le chiffrement Sqlite: utiliser Microsoft.Data.Sqlite selon ma réponse ici .

0
paulyb

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

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

Lorsque vous insérez des données, vous pouvez utiliser directement la fonction de cryptage 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');
0
Alien426

Pour les projets utilisant Javascript, le paquetage écrit par journeyapps fonctionne de manière transparente.

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

Cela a fonctionné 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
liangzan

Il comprend tout ce que vous recherchez.

navigateur de base de données pour sqlite:

https://sqlitebrowser.org/

Création facile de tableaux, modification facile des données, suppression facile et composants faciles à voir.

document:

https://github.com/sqlitebrowser/sqlitebrowser/wiki

0
SHO