Beveilig een SQLite DB met een wachtwoord. Is het mogelijk?

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 NULLof ""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 ConnectionStringzoals in het vorige voorbeeld, of roept u de SetPassword()functie voordat u een nieuwe SQLiteConnectionopent. Wachtwoorden die zijn opgegeven in de ConnectionStringmoeten 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.

Other episodes