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


88

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

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

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

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

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

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


2
당신은 체크 아웃 할 수 있습니다 SQLiteCrypt
마이크 Buckbee


디버깅을 위해 DB를 자주 잠금 / 잠금 해제해야하는 경우이 도구를 사용 해보세요. goo.gl/12VnQd
Mangesh

여기에서 솔루션을 찾을 수 있습니다. 여기 에 링크 설명을 입력하십시오.
Ishwar Rimal 2011

답변:


73

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

지금까지 이와 같이 암호로 보호 된 데이터베이스를 여는 유일한 무료 도구 는 이 답변에 자세히 설명 된 SQLite2009 Pro 입니다.
JumpingJezza jul.

이 예는 어떤 언어입니까? .NET처럼 보입니까?
pim

1
기술적으로 .NET은 프레임 워크입니다. C #은 여기에 표시되는 언어입니다.
vapcguy

또한 암호를 변경할 때마다 다음에 열기 전에 연결 문자열을 업데이트하는 데주의해야합니다. 그렇지 않으면 오류가 발생할 수 있습니다. stackoverflow.com/questions/16030601/…
vapcguy

암호가 제공되지 않으면 Open ()은 예상대로 암호로 보호 된 SQLite 데이터베이스에서 실패하지 않습니다! 실패한 것은 열린 파일에 대한 후속 데이터 또는 메타 데이터 작업입니다.
Cristi S.

33

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

2
이 링크 전용 답변은 실제로 왜 우리가 SO에서 링크 전용 답변을하지 않는지 분명한 예입니다. 실제 링크는 사라졌습니다. 더 이상 존재하지 않습니다. 이 사이트를 볼 수있는 유일한 이유는 web.archive.org에 의해 자동으로 보관 되었기 때문입니다.
Hanlet Escaño

더 이상 작동하지 않으며 최신 버전에는 이러한 기능이 없습니다.
MindRoasterMir

12

데이터베이스 파일의 투명한 256 비트 AES 암호화를 제공하는 SQLite 용 오픈 소스 확장 인 SQLCipher를 사용합니다. http://sqlcipher.net


2
속도는 어떻습니까? sqlcipher를 사용하면 성능이 저하됩니까?
TomSawyer

6

SEE 애드온으로 SQLite 데이터베이스를 암호화 할 수 있습니다. 이렇게하면 무단 액세스 / 수정을 방지 할 수 있습니다.

SQLite 문서 인용 :

SQLite 암호화 확장 (SEE)은 128 비트 또는 256 비트 AES를 사용하여 데이터베이스 파일을 암호화하여 무단 액세스 또는 수정을 방지하는 SQLite의 향상된 버전입니다. 전체 데이터베이스 파일이 암호화되어 외부 관찰자에게는 데이터베이스 파일에 백색 잡음이 포함 된 것처럼 보입니다. 파일을 SQLite 데이터베이스로 식별하는 것은 없습니다.

이 링크 에서이 애드온에 대한 자세한 정보를 찾을 수 있습니다 .


7
그 확장은 또한 sqlite의 유료 애드온입니다.
John Boker

3

한 가지 옵션은 VistaDB 입니다. 이를 통해 데이터베이스 (또는 테이블)를 암호로 보호 (선택적으로 암호화) 할 수 있습니다.


1
더 효율적이고 자유로운 방법이 있습니다!
완 주

1
@MSS 그러나-내가 말했듯이 VistaDB 솔루션은 전체 DB 연결 암호화 대신 테이블 수준에서 별도의 암호화를 포함하는 몇 가지 장점이 있습니다. 이 작업을 수행하는 다른 .NET 기본 옵션은 없습니다. 또한 대부분의 다른 옵션과 달리 순수 관리 방식입니다. 무료가 아니라고해서 더 효율적이거나 더 나은 옵션이 있다는 의미는 아닙니다. 사용 요구 사항에 완전히 의존합니다.
Reed Copsey

3

sqlite db를 보호하는 암호에 대한 질문에 대해 할 수 있다고 생각하지 않습니다.

하지만 암호화 할 수 있습니다. 여기에 대한 몇 가지 정보가 있습니다.

http://sqlcrypt.com/

플랫폼 당 $ 149입니다.


3

당신이 사용하는 경우 FluentNHibernate를 사용하면 설정 코드를 사용할 수 있습니다 :

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

FileWithPassword (filename, password)를 사용하는 방법 은 데이터베이스 파일을 암호화하고 암호를 설정합니다.
새 데이터베이스 파일이 생성 된 경우에만 실행됩니다. 이 방법으로를 열면 암호화되지 않은 이전 암호화가 실패합니다.


2

나는 이것이 오래된 질문이라는 것을 알고 있지만 간단한 해결책은 OS 수준에서 파일을 보호하는 것이 아닐까요? 사용자가 파일에 액세스하지 못하도록 차단하면 파일을 만질 수 없습니다. 이것은 추측 일 뿐이며 이것이 이상적인 솔루션인지 확실하지 않습니다.


2
USB 스틱이있는 사람은 누구나 다른 OS로 부팅하여 파일을 읽을 수 있기 때문에 이것이 좋은 솔루션인지 확실하지 않습니다.
nurettin 2016

나는 그것이 공정한 지적이라고 생각하지만 그 경우 USB를 비활성화하십시오. 일부 사용자가 컴퓨터에 물리적으로 액세스 할 수있는 경우 수행 할 수있는 다른 작업이 많이 있습니다.
David Price

당신은 너무 민감한 데이터를 보호하려는 경우에만 그 다른 일이 잘못 갈 것입니다.
tripleee

SQLite 데이터베이스를 사용하면 실제로는 전혀 불가능합니다. 사용자가 읽고 쓸 수 있어야합니다. 즉, SQLite DB가있는 폴더의 ACL에서도 해당 권한을 허용해야합니다. 실제 사용자에게만 해당 폴더에 대한 권한을 허용함으로써 비 사용자로부터 보안을 유지할 수 있지만 여전히 "내부자 위협"이 있습니다.
vapcguy

1

데이터베이스를 암호화해야하는 이유는 무엇입니까? 사용자는 쉽게 프로그램을 분해하고 키를 알아낼 수 있습니다. 네트워크 전송을 위해 암호화하는 경우 암호화 계층을 데이터베이스 계층으로 압축하는 대신 PGP를 사용하는 것이 좋습니다.


6
사용자는 시작할 때 암호를 요구할 수 있으므로 프로그램을 분해해도 키를 얻을 수 없습니다.
kgadek

1
Redgate Reflector 또는 ILSpy를 사용하십시오.
Zev Spitz

4
프로그램에 키를 넣는 이유는 무엇입니까? 그렇게하지 않고 사용자 암호에서 키를 생성하여 사용하면 소스 코드에 비밀이 필요하지 않습니다.
trampster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.