SQLite avec cryptage/protection par mot de passe
j'apprends juste à utiliser SQLite et j'étais curieux si cela est possible:
-
cryptage du fichier de base de données?
-
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."
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.
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);
.net-library du Système.Données.SQLite fournit également le cryptage.
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
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.
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();
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.
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.
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');
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.