Parola ile bir SQLite DB'yi koruyun. Mümkün mü?


88

Yeni küçük bir projeyle yüzleşmem gerekiyor. Yaklaşık 7 veya 9 masaya sahip olacak, en büyüğü ayda maksimum 1000 satır büyüyecek.

Veritabanım olarak SQLite'ı düşündüm ... Ancak herhangi birinin veritabanındaki verileri değiştirmek istemesi durumunda veritabanını korumam gerekecek

Benim asıl sorum şu:

Erişimde yaptığınız gibi bir sqlite db'yi parola ile korumak mümkün müdür?

Bu kadar küçük bir çözüm için başka hangi RDBMS'yi önerirsiniz?

Geliştirme C # üzerinde olacaktır, ancak ücretsiz bir şey arıyorum.




Hata ayıklama için DB'yi
Mangesh

Çözümü burada bulabilirsiniz bağlantı açıklamasını
Ishwar Rimal

Yanıtlar:


72

Bir SQLite3 DB'yi parola ile koruyabilirsiniz. Herhangi bir işlem yapmadan önce, şifreyi aşağıdaki gibi ayarlayın.

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();

sonra bir dahaki sefere şöyle erişebilirsin

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

Bu, herhangi bir GUI düzenleyicinin verilerinizi görüntülemesine izin vermez. Parolayı verirseniz bazı düzenleyiciler DB'nin şifresini çözebilir. Kullanılan algoritma RSA'dır.

Daha sonra şifreyi değiştirmek isterseniz,

conn.ChangePassword("new_password");

Parolayı sıfırlamak veya kaldırmak için kullanın

conn.ChangePassword(String.Empty);

Şimdiye kadar bulduğum ve bunun gibi parola korumalı veritabanlarını açacak tek ücretsiz araç , bu yanıtta ayrıntılı olarak açıklanan SQLite2009 Pro'dur .
JumpingJezza

Bu örnek hangi dildir? .NET'e benziyor mu?
pim

1
Teknik olarak, .NET çerçevedir. C #, burada görüntülenen dildir.
vapcguy

Ayrıca, şifreyi her değiştirdiğinizde bir sonraki açılıştan önce bağlantı dizesini güncellerken dikkatli olmalısınız, aksi takdirde hatalarla karşılaşabilirsiniz: stackoverflow.com/questions/16030601/…
vapcguy

Parola sağlanmadan Open () beklediğiniz gibi parola korumalı bir SQLite veritabanında başarısız OLMAYACAKTIR! Başarısız olan, o açık dosyada sonraki herhangi bir veri veya meta veri işlemidir.
Cristi S.

33

Sqlite .net sağlayıcısının (System.Data.SQLite) yerleşik şifrelemesini kullanabilirsiniz. Http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx adresinde daha fazla ayrıntıya bakın.

İçin varolan şifresiz veritabanını şifrelemek veya şifreli bir veritabanının şifresini değiştirmek için , veritabanını açın ve ardından SQLiteConnection ait ChangePassword () işlevini kullanın:

// 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");

İçin mevcut bir şifreli veritabanı şifresini çağrıyı ChangePassword()bir ile NULLveya ""şifre:

// 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);

Mevcut bir şifrelenmiş veri tabanını açmak veya yeni bir şifreli veri tabanı oluşturmak için ConnectionString, önceki örnekte gösterildiği gibi içinde bir şifre belirtin veya yenisini SetPassword()açmadan önce işlevi çağırın SQLiteConnection. ConnectionStringİçinde belirtilen parolalar düz metin olmalıdır, ancak SetPassword()işlevde sağlanan parolalar ikili bayt dizileri olabilir.

// 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

Varsayılan olarak, ATTACH anahtar sözcüğü, başka bir veritabanı dosyasını mevcut bir bağlantıya eklerken ana veritabanıyla aynı şifreleme anahtarını kullanacaktır. Bu davranışı değiştirmek için KEY değiştiricisini aşağıdaki gibi kullanırsınız:

Açık metin parolası kullanarak şifrelenmiş bir veritabanı ekliyorsanız:

// 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();

İkili parola kullanarak şifrelenmiş bir veritabanı eklemek için:

// 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();

2
Bu yalnızca bağlantı yanıtı aslında neden SO'da yalnızca bağlantı yanıtları yapmadığımızın açık bir örneğidir. Asıl bağlantı gitti; artık yok. Siteyi görebilmemizin tek nedeni, web.archive.org tarafından otomatik olarak arşivlenmiş olmasıdır.
Hanlet Escaño

Artık çalışmıyor, son sürümlerde böyle bir işlev bulunamadı.
MindRoasterMir

12

SQLCipher kullanın, veritabanı dosyalarının şeffaf 256 bit AES şifrelemesini sağlayan SQLite için açık kaynaklı bir uzantıdır. http://sqlcipher.net


2
Hız nasıl? Sqlcipher kullanırsam performansı düşürür mü?
TomSawyer

6

SQLite veritabanınızı SEE eklentisi ile şifreleyebilirsiniz. Bu şekilde yetkisiz erişimi / değişikliği önlersiniz.

SQLite belgelerinden alıntı yapma:

SQLite Şifreleme Uzantısı (SEE), yetkisiz erişimi veya değişikliği önlemeye yardımcı olmak için veritabanı dosyalarını 128 bit veya 256 Bit AES kullanarak şifreleyen gelişmiş bir SQLite sürümüdür. Tüm veritabanı dosyası şifrelenir, böylece dışarıdan bir gözlemciye veritabanı dosyası beyaz gürültü içeriyor gibi görünür. Dosyayı bir SQLite veritabanı olarak tanımlayan hiçbir şey yoktur.

Bu eklenti hakkında daha fazla bilgiyi bu bağlantıda bulabilirsiniz .


7
bu uzantı aynı zamanda sqlite için ödenen bir eklentidir.
John Boker 04

3

Bir seçenek VistaDB olacaktır . Veritabanlarının (hatta tabloların) parola korumalı (ve isteğe bağlı olarak şifrelenmiş) olmasına izin verir.


1
Daha verimli ve özgür yollar var!
Sawan

1
@MSS Ancak - dediğim gibi, VistaDB çözümünün tam DB bağlantı şifrelemesi yerine bir tablo seviyesinde ayrı şifreleme gibi bazı avantajları vardır. Bunu gerçekleştiren başka .NET yerel seçeneği bilmiyorum. Diğer birçok seçeneğin aksine, tamamen yönetilir - ücretsiz olmaması, daha verimli veya daha iyi seçeneklerin olduğu anlamına gelmez - tamamen kullanım gereksinimlerine bağlıdır.
Reed Copsey

3

Eğer kullanırsanız FluentNHibernate yapılandırma kodu aşağıdakileri kullanabilirsiniz:

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);
        }
}    

Yöntem UsingFileWithPassword (dosya adı, parola) bir veritabanı dosyasını şifreler ve parola belirler.
Yalnızca yeni veritabanı dosyası oluşturulursa çalışır. Bu yöntemle açıldığında şifrelenmemiş olan eski başarısız olur.


2

Bunun eski bir soru olduğunu biliyorum, ancak basit çözüm dosyayı işletim sistemi düzeyinde korumak olmaz mı? Kullanıcıların dosyaya erişimini engellemeniz ve ardından dosyaya dokunamamaları gerekir. Bu sadece bir tahmin ve bunun ideal bir çözüm olup olmadığından emin değilim.


2
Bunun iyi bir çözüm olup olmadığından emin değilim çünkü USB çubuğu olan herhangi biri başka bir işletim sistemine önyükleme yapabilir ve dosyaları okuyabilir.
nurettin

Bunun adil bir nokta olduğunu düşünüyorum, ancak bu durumda USB'yi devre dışı bırakın. Bazılarının makinenize fiziksel erişimi varsa, yapılabilecek daha birçok şey vardır.
David Price

Hassas verileri korumak istiyorsunuz, böylece yalnızca diğer şeyler ters gidecek.
üçlü

SQLite veritabanı ile bu aslında mümkün DEĞİLDİR. Kullanıcıların hem okuyabilmeleri hem de yazabilmeleri için ihtiyacınız var, yani SQLite DB'nin yaşadığı klasörün ACL'si de bu izinlere izin vermelidir. Yalnızca gerçek kullanıcıların o klasöre girmesine izin vererek onu kullanıcı olmayanlara karşı güvence altına alabilirsiniz, ancak yine de "içeriden tehdit" e sahipsiniz.
vapcguy

1

Veritabanını neden şifrelemeniz gerekiyor? Kullanıcı, programınızı kolayca parçalarına ayırabilir ve anahtarı bulabilir. Ağ aktarımı için şifreliyorsanız, bir şifreleme katmanını bir veritabanı katmanına sıkıştırmak yerine PGP kullanmayı düşünün.


6
Kullanıcıdan başlangıçta parola istenebilir, böylece programı sökerek hiçbir anahtara ulaşılamaz.
kgadek

1
Redgate Reflector veya ILSpy kullanın.
Zev Spitz

4
Neden anahtarı programa koydunuz? bunu yapmazsınız, kullanıcı şifresinden bir anahtar oluşturup onu kullanmazsınız, o zaman kaynak kodunuzda herhangi bir sırra ihtiyacınız olmaz.
trampster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.