programing

SQLite DB를 암호로 보호합니다.

nasanasas 2020. 9. 19. 11:23
반응형

SQLite DB를 암호로 보호합니다. 가능할까요?


새로운 작은 프로젝트에 직면해야합니다. 약 7 ~ 9 개의 테이블이 있으며, 그중 가장 큰 테이블은 한 달에 최대 1000 행씩 증가합니다.

SQLite를 내 db로 생각했습니다.하지만 누군가 db에서 데이터를 변경하려는 경우 DB를 보호해야합니다.

내 주요 질문은 다음과 같습니다.

액세스 할 때처럼 암호로 sqlite db를 보호 할 수 있습니까?

이러한 소규모 솔루션에 대해 어떤 다른 RDBMS를 권장 하시겠습니까?

개발은 C #에 있지만 무료로 검색하고 있습니다.


SQLite3 DB를 암호로 보호 할 수 있습니다. 작업을 수행하기 전에 다음과 같이 암호를 설정하십시오.

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

다음에 다음과 같이 액세스 할 수 있습니다.

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

이렇게하면 GUI 편집기에서 데이터를 볼 수 없습니다. 일부 편집자는 암호를 제공하면 DB를 해독 할 수 있습니다. 사용 된 알고리즘은 RSA입니다.

나중에 암호를 변경하려면

conn.ChangePassword("new_password");

비밀번호를 재설정하거나 제거하려면

conn.ChangePassword(String.Empty);

sqlite .net 공급자 (System.Data.SQLite)의 기본 제공 암호화를 사용할 수 있습니다. http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx 에서 자세한 내용을 참조하십시오.

암호화되지 않은 기존 데이터베이스암호화 하거나 암호화 된 데이터베이스의 비밀번호를 변경하려면 데이터베이스 를 연 다음 SQLiteConnection의 ChangePassword () 함수를 사용합니다.

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

또는 암호를 사용 하여 기존의 암호화 된 데이터베이스 호출 해독 하려면 :ChangePassword()NULL""

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

기존의 암호화 된 데이터베이스를 열거 나 새 암호화 된 데이터베이스를 만들려면 ConnectionString이전 예에 표시된대로에 암호를 지정 하거나 SetPassword()SQLiteConnection. 에 지정된 암호 ConnectionString는 일반 텍스트 여야하지만 SetPassword()함수에 제공된 암호 는 이진 바이트 배열 일 수 있습니다.

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

기본적으로 ATTACH 키워드는 다른 데이터베이스 파일을 기존 연결에 연결할 때 기본 데이터베이스와 동일한 암호화 키를 사용합니다. 이 동작을 변경하려면 다음과 같이 KEY 수정자를 사용합니다.

일반 텍스트 암호를 사용하여 암호화 된 데이터베이스를 연결하는 경우 :

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

이진 암호를 사용하여 암호화 된 데이터베이스를 연결하려면 :

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

Use SQLCipher, it's an opensource extension for SQLite that provides transparent 256-bit AES encryption of database files. http://sqlcipher.net


You can encrypt your SQLite database with the SEE addon. This way you prevent unauthorized access/modification.

Quoting SQLite documentation:

The SQLite Encryption Extension (SEE) is an enhanced version of SQLite that encrypts database files using 128-bit or 256-Bit AES to help prevent unauthorized access or modification. The entire database file is encrypted so that to an outside observer, the database file appears to contain white noise. There is nothing that identifies the file as an SQLite database.

You can find more info about this addon in this link.


One option would be VistaDB. They allow databases (or even tables) to be password protected (and optionally encrypted).


for your question about password protecting your sqlite db, i don't think it can be done.

you can encrypt it though, here's some information on that:

http://sqlcrypt.com/

it's $149 per platform.


If you use FluentNHibernate you can use following configuration code:

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

Method UsingFileWithPassword(filename, password) encrypts a database file and sets password.
It runs only if the new database file is created. The old one not encrypted fails when is opened with this method.


I know this is an old question but wouldn't the simple solution be to just protect the file at the OS level? Just prevent the users from accessing the file and then they shouldn't be able to touch it. This is just a guess and I'm not sure if this is an ideal solution.


Why do you need to encrypt the database? The user could easily disassemble your program and figure out the key. If you're encrypting it for network transfer, then consider using PGP instead of squeezing an encryption layer into a database layer.

참고URL : https://stackoverflow.com/questions/1381264/password-protect-a-sqlite-db-is-it-possible

반응형