[encryption] 암호화 / 암호 보호 기능이있는 SQLite

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

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

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

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



답변

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

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

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

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


답변

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


답변

.net 라이브러리 System.Data.SQLite 도 암호화를 제공합니다.


답변

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


답변

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

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


답변

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


답변

글쎄, 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