Ik moet een nieuw klein project onder ogen zien. Het zal ongeveer 7 of 9 tafels hebben, de grootste zal groeien met een maximale snelheid van 1000 rijen per maand.
Ik dacht aan SQLite als mijn db… Maar ik zal de db moeten beschermen voor het geval iemand gegevens van de db wil wijzigen
Mijn belangrijkste vraag is:
Is het mogelijk om een sqlite db met een wachtwoord te beveiligen zoals je zou doen bij toegang?
De ontwikkeling zou in C# plaatsvinden, maar ik ben op zoek naar iets gratis.
Antwoord 1, autoriteit 100%
U kunt een SQLite3 DB beveiligen met een wachtwoord. Stel het wachtwoord als volgt in voordat u bewerkingen uitvoert.
SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();
en de volgende keer dat je er toegang toe hebt, zoals
conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();
Hierdoor kan geen enkele GUI-editor uw gegevens bekijken. Sommige editors kunnen de DB ontsleutelen als u het wachtwoord opgeeft. Het gebruikte algoritme is RSA.
Als u later het wachtwoord wilt wijzigen, gebruikt u
conn.ChangePassword("new_password");
Gebruik
. om het wachtwoord opnieuw in te stellen of te verwijderen
conn.ChangePassword(String.Empty);
Antwoord 2, autoriteit 44%
U kunt de ingebouwde codering van de sqlite .net-provider (System.Data.SQLite) gebruiken. Zie meer details op http:/ /web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx
Om een bestaande niet-versleutelde database te versleutelen, of om het wachtwoord van een versleutelde database te wijzigen, opent u de database en gebruikt u vervolgens de functie ChangePassword() van SQLiteConnection:
// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");
Om een bestaande versleutelde database te ontsleutelenroept u ChangePassword()
aan met een NULL
of ""
wachtwoord:
// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);
Als u een bestaande versleutelde database wilt openen of een nieuwe versleutelde database wilt maken, geeft u een wachtwoord op in de ConnectionString
zoals in het vorige voorbeeld, of roept u de SetPassword()
functie voordat u een nieuwe SQLiteConnection
opent. Wachtwoorden die zijn opgegeven in de ConnectionString
moeten leesbare tekst zijn, maar wachtwoorden die worden opgegeven in de functie SetPassword()
kunnen binaire bytearrays zijn.
// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable
Standaard gebruikt het ATTACH-sleutelwoord dezelfde coderingssleutel als de hoofddatabase wanneer een ander databasebestand aan een bestaande verbinding wordt toegevoegd. Om dit gedrag te veranderen, gebruikt u de KEY-modifier als volgt:
Als u een gecodeerde database koppelt met een wachtwoord in leesbare tekst:
// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();
Een versleutelde database koppelen met een binair wachtwoord:
// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();
Antwoord 3, autoriteit 19%
Gebruik SQLCipher, het is een opensource-extensie voor SQLite die transparante 256-bits AES-codering van databasebestanden biedt. http://sqlcipher.net
Antwoord 4, autoriteit 8%
U kunt uw SQLite-database versleutelen met de SEE-add-on. Zo voorkom je ongeoorloofde toegang/wijziging.
Citeer SQLite-documentatie:
De SQLite Encryption Extension (SEE) is een verbeterde versie van SQLite die databasebestanden versleutelt met 128-bits of 256-bits AES om ongeoorloofde toegang of wijziging te voorkomen. Het volledige databasebestand is gecodeerd zodat voor een externe waarnemer het databasebestand witte ruis lijkt te bevatten. Er is niets dat het bestand identificeert als een SQLite-database.
Je kunt meer informatie over deze add-on vinden in deze link.
Antwoord 5, autoriteit 5%
Een optie is VistaDB. Ze zorgen ervoor dat databases (of zelfs tabellen) met een wachtwoord kunnen worden beveiligd (en optioneel versleuteld).
Antwoord 6, autoriteit 4%
Als u FluentNHibernategebruikt, kunt u de volgende configuratiecode gebruiken:
private ISessionFactory createSessionFactory()
{
return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
.ExposeConfiguration(this.buildSchema)
.BuildSessionFactory();
}
private void buildSchema(Configuration config)
{
if (filename_not_exists == true)
{
new SchemaExport(config).Create(false, true);
}
}
Methode UsingFileWithPassword(bestandsnaam, wachtwoord)versleutelt een databasebestand en stelt een wachtwoord in.
Het wordt alleen uitgevoerd als het nieuwe databasebestand is gemaakt. De oude, niet versleuteld, mislukt wanneer deze met deze methode wordt geopend.
Antwoord 7, autoriteit 3%
Ik weet dat dit een oude vraag is, maar zou de eenvoudige oplossing niet zijn om het bestand gewoon op OS-niveau te beschermen? Voorkom gewoon dat de gebruikers toegang krijgen tot het bestand en dan zouden ze het niet moeten kunnen aanraken. Dit is slechts een gok en ik weet niet zeker of dit een ideale oplossing is.
Antwoord 8
Waarom moet u de database versleutelen? De gebruiker kan uw programma gemakkelijk demonteren en de sleutel achterhalen. Als je het versleutelt voor netwerkoverdracht, overweeg dan om PGP te gebruiken in plaats van een versleutelingslaag in een databaselaag te persen.