J'apprends juste à utiliser SQLite et j'étais curieux de savoir si cela est possible:
Chiffrement du fichier de base de données?
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."
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:
SEE, SQLiteCrypt et SQLiteCrypto nécessitent l’achat d’une licence.
Divulgation: J'ai créé botansqlite3.
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);
La bibliothèque .net System.Data.SQLite fournit également un cryptage.
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
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.
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();
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.
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.
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 .
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');
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.
Il comprend tout ce que vous recherchez.
navigateur de base de données pour sqlite:
Création facile de tableaux, modification facile des données, suppression facile et composants faciles à voir.
document: