암호화 / 암호 보호 기능이있는 SQLite


136

나는 단지 SQLite를 사용하는 법을 배우고 있는데 가능하다면 궁금합니다.

  1. 데이터베이스 파일의 암호화?

  2. 데이터베이스 열기를 비밀번호로 보호 하시겠습니까?

추신. 이 "SEE (SQLite Encryption Extension)"가 있다는 것을 알고 있지만 설명서에 따르면 "SEE는 라이센스가있는 소프트웨어입니다 ..."및 "SEE의 영구적 인 소스 코드 라이센스 비용은 US $ 2000입니다."


확실히 가능하며 SEE 외에 몇 가지 오픈 소스 솔루션이 있습니다. 그중에는 wxSQLite3와 함께 제공되는 암호화 확장 기능이 있습니다. 자세한 내용은 비슷한 질문에 대한 답변을 참조하십시오.
Ulrich Telle

1
@RobotMess : 솔직히 말해서 여기에 나열된 것은 없습니다. 나는 그 프로젝트에 엄격한 시간 제약이 있었기 때문에 빠른 일을해야했다. 나는 내가 가장 잘 아는 것과 함께 갔다-원시 데이터에 대한 AES를 DB에 넣기 전에 ... 조회, 검색 및 DB 관리 측면에서 매우 효율적이지 않다.
ahmd0

@ ahmd0 흠, DB의 종류를 쓸모 없게 만들지 않습니까? 내 말은, 지금 실제로하는 일은 커밋이 원 자성을 보장하는 것입니다.
Navin

네 가능합니다. 대상 닷넷 표준 4.6.1+ 또는 코어, 나는 매우 간단 얻을 생각하면 SQLite는 암호화 내 대답 당 Microsoft.Data.Sqlite을 사용하는 것입니다 여기에 .
paulyb

답변:


110

SQLite에는 정규 배포에 사용되지 않는 암호화 용 후크가 내장되어 있지만 다음과 같은 몇 가지 구현이 있습니다.

  • 참조 -공식 구현.
  • wxSQLite -SQLite의 암호화도 구현하는 wxWidgets 스타일 C ++ 래퍼입니다.
  • SQLCipher -openSSL의 libcrypto를 사용하여 구현합니다.
  • SQLiteCrypt- 사용자 정의 구현, 수정 된 API.
  • botansqlite3 -botansqlite3은 암호화를 위해 Botan의 모든 알고리즘을 사용할 수있는 SQLite3 용 암호화 코덱입니다.
  • sqleet -ChaCha20 / Poly1305 프리미티브를 사용하는 또 다른 암호화 구현. 위에서 언급 한 wxSQLite는이를 암호화 공급자로 사용할 수 있습니다.

SEE 및 SQLiteCrypt는 라이센스 구매가 필요합니다.

공개 : 나는 botansqlite3을 만들었습니다.


1
SQLite 데이터베이스 암호화를위한 사용 방법 Botan에 대한 문서가 있습니까? Botan 웹 사이트에는이 기능이 언급되어 있지 않습니다.
Marc Schlösser

5
botansqlite3는 이제 독립적으로 Botan과 함께 배포됩니다.
OliJG

1
litereplica있습니다 . 그것은하는 ARMv7에 기초하여 휴대용 장치에보다 빠른 AES는 차차 암호를 사용
베르나르 라모스

현재 암호화 지원 기능이 내장 된 SQLite3 .Net은이 답변을 대부분 무효화합니다.
Krythic 2019

21

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 편집기에서 데이터를 볼 수 없습니다. 나중에 비밀번호를 변경하려면conn.ChangePassword("new_password"); 하려면 다음을 하십시오. 비밀번호를 재설정하거나 제거하려면conn.ChangePassword(String.Empty);


16
오픈 소스 Sqlite에서는 작동하지 않습니다. 이것이 어떤 언어 구현, 언어 또는 API인지는 알 수 없습니다.
mikerobi

1
어떤 암호화 방식을 ChangePassword사용 했는지 어떻게 알 수 있습니까? AES 128? RSA ..?
qakmak

1
RSA 1024 또는 2048? 더 자세한 내용을 볼 수있는 문서가 있습니까?
qakmak


내 자신의 테스트 SetPassword에서 (현재) 방법이 기본적으로 쓸모없는 것으로 나타났습니다. System.Data.SQLite라이브러리에서 암호를 올바르게 적용 할 수있는 유일한 방법 은 ChangePassword방법 을 사용하는 것입니다. SetPassword( 라이브러리에서 필요로하는 것처럼 메서드 호출 하기 전에)를 사용하여 Open암호없이 SQLiteStudio에서 DB를 열고 편집 할 수있었습니다. 암호 응용 프로그램이 실제로 "고착 된" ChangePassword메서드를 사용한 후에 (메서드 호출 한 후) 사용되지 않았습니다 Open.
G_Hosa_Phat


7

http://system.data.sqlite.org/sqlite3.dll 에서 암호화 지원 파일을 얻을 수 있습니다 .

1- http ://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki로 이동 하십시오 하여 패키지 중 하나를 다운로드하십시오. .NET 버전은 여기와 관련이 없습니다.

2- SQLite.Interop.dll패키지에서 추출 하여 이름을 바꿉니다.sqlite3.dll . 이 DLL은 일반 텍스트 비밀번호 또는 암호화 키를 통한 암호화를 지원합니다.

언급 된 파일은 기본 파일이며 .NET 프레임 워크가 필요 하지 않습니다 . 다운로드 한 패키지에 따라 Visual C ++ 런타임이 필요할 수 있습니다.

최신 정보

이것은 32 비트 개발을 위해 다운로드 한 패키지입니다 : http://system.data.sqlite.org/blobs/1.0.94.0/sqlite-netFx40-static-binary-Win32-2010-1.0.94.0.zip


내 특정 예에서는 .lib실행 파일에 포함시킬 수 있어야했습니다 . dll이 없습니다.
ahmd0

2
이 하나 확인하시기 바랍니다 github.com/rindeal/wxSQLite3-VS 당신에게 줄 것이다 libdll파일을.
Mohammad Banisaeid

4

다음은 적절한 보안 솔루션을 대체하기위한 것이 아닙니다.

4 일 동안이 문제를 해결 한 후에 NuGet의 오픈 소스 System.Data.SQLite 패키지 만 사용하여 솔루션을 구성했습니다. 이것이 얼마나 많은 보호를 제공하는지 모르겠습니다. 나는 내 자신의 학습 과정에만 사용하고 있습니다. 그러면 DB가 생성되고 암호화되어 테이블이 생성되며 데이터가 추가됩니다.

using System.Data.SQLite;

namespace EncryptDB
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = @"C:\Programming\sqlite3\db.db";
            string passwordString = "password";
            byte[] passwordBytes = GetBytes(passwordString);
            SQLiteConnection.CreateFile(connectionString);
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
            conn.SetPassword(passwordBytes);
            conn.Open();
            SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
            sqlCmd.ExecuteNonQuery();
            sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
            sqlCmd.ExecuteNonQuery();
            conn.Close();
        }
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            bytes = System.Text.Encoding.Default.GetBytes(str);
            return bytes;
        }
    }
}

선택적으로을 제거 하고 다음에 배치해야하는 conn.SetPassword(passwordBytes);것으로 교체 할 수 있습니다.conn.ChangePassword("password");conn.Open(); 이전 대신에 . 그러면 GetBytes 메서드가 필요하지 않습니다.

암호를 해독하려면 열기 전에 연결 문자열에 암호를 입력하면됩니다.

        string filename = @"C:\Programming\sqlite3\db.db";
        string passwordString = "password";
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
        conn.Open();

2
"I think I saw 128 bit somewhere"-암호화를 처리하려는 경우 매우 나쁜 말입니다. 경험의 원칙은 이해하지 못하는 경우 절대 스스로하지 않는 것입니다. 그렇지 않으면 전혀 사용하지 않는 것이 좋습니다.
ahmd0

너의 의도를 알 겠어. 필자는 현재 버전의 System.Data.Sqlite에서 작동하지 않는 조언을 수정하려고했습니다. 나는 이것이 좋은 보안이라는 것을 의미하지는 않았다. 내 게시물을 업데이트했습니다. 입력 주셔서 감사합니다!
Mike Warner

2

항상 클라이언트 측에서 데이터를 암호화 할 수 있습니다. 성능 문제가 있기 때문에 모든 데이터를 암호화 할 필요는 없습니다.


1

글쎄, SEE비싸다. 그러나 SQLite암호화를위한 인터페이스가 내장되어 있습니다 (Pager). 즉, 기존 코드 위에 쉽게 암호화 메커니즘을 개발할 수 있으므로 반드시 그럴 필요는 없습니다 AES. 정말요 내 게시물을 참조하십시오 : https : //.com/a/49161716/9418360

호출기 암호화를 사용하려면 SQLITE_HAS_CODEC = 1을 정의해야합니다. 아래 샘플 코드 (원본 SQLite소스) :

#ifdef SQLITE_HAS_CODEC
/*
** This function is called by the wal module when writing page content
** into the log file.
**
** This function returns a pointer to a buffer containing the encrypted
** page content. If a malloc fails, this function may return NULL.
*/
SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
  void *aData = 0;
  CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
  return aData;
}
#endif

거기에 상용 버전 C language에 대한 SQLite그것은 또한 작업 할 수 있습니다 - 암호화 AES256을 사용은 PHP하지만 컴파일해야 PHPSQLite확장. SQLite데이터베이스 파일을 즉시 해독 / 암호화 하고 파일 내용은 항상 암호화됩니다. 굉장히 유용하다.

http://www.iqx7.com/products/sqlite-encryption


0

SQLite의 함수 생성 루틴을 사용할 수 있습니다 ( PHP manual ).

$db_obj->sqliteCreateFunction('Encrypt', 'MyEncryptFunction', 2);
$db_obj->sqliteCreateFunction('Decrypt', 'MyDecryptFunction', 2);

데이터를 삽입 할 때 암호화 기능을 직접 사용하고 암호화 된 데이터를 삽입하거나 사용자 정의 기능을 사용하여 암호화되지 않은 데이터를 전달할 수 있습니다.

$insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
 'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');

데이터를 검색 할 때 SQL 검색 기능을 사용할 수도 있습니다.

$select_obj = $db_obj->prepare('SELECT Clear, ' .
 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
 'WHERE PlainText LIKE :searchterm');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.