나는 단지 SQLite를 사용하는 법을 배우고 있는데 가능하다면 궁금합니다.
데이터베이스 파일의 암호화?
데이터베이스 열기를 비밀번호로 보호 하시겠습니까?
추신. 이 "SEE (SQLite Encryption Extension)"가 있다는 것을 알고 있지만 설명서에 따르면 "SEE는 라이센스가있는 소프트웨어입니다 ..."및 "SEE의 영구적 인 소스 코드 라이센스 비용은 US $ 2000입니다."
나는 단지 SQLite를 사용하는 법을 배우고 있는데 가능하다면 궁금합니다.
데이터베이스 파일의 암호화?
데이터베이스 열기를 비밀번호로 보호 하시겠습니까?
추신. 이 "SEE (SQLite Encryption Extension)"가 있다는 것을 알고 있지만 설명서에 따르면 "SEE는 라이센스가있는 소프트웨어입니다 ..."및 "SEE의 영구적 인 소스 코드 라이센스 비용은 US $ 2000입니다."
답변:
SQLite에는 정규 배포에 사용되지 않는 암호화 용 후크가 내장되어 있지만 다음과 같은 몇 가지 구현이 있습니다.
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);
ChangePassword
사용 했는지 어떻게 알 수 있습니까? AES 128? RSA ..?
SetPassword
에서 (현재) 방법이 기본적으로 쓸모없는 것으로 나타났습니다. System.Data.SQLite
라이브러리에서 암호를 올바르게 적용 할 수있는 유일한 방법 은 ChangePassword
방법 을 사용하는 것입니다. SetPassword
( 라이브러리에서 필요로하는 것처럼 메서드 를 호출 하기 전에)를 사용하여 Open
암호없이 SQLiteStudio에서 DB를 열고 편집 할 수있었습니다. 암호 응용 프로그램이 실제로 "고착 된" ChangePassword
메서드를 사용한 후에 (메서드 를 호출 한 후) 사용되지 않았습니다 Open
.
.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
.lib
실행 파일에 포함시킬 수 있어야했습니다 . dll이 없습니다.
다음은 적절한 보안 솔루션을 대체하기위한 것이 아닙니다.
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();
"I think I saw 128 bit somewhere"
-암호화를 처리하려는 경우 매우 나쁜 말입니다. 경험의 원칙은 이해하지 못하는 경우 절대 스스로하지 않는 것입니다. 그렇지 않으면 전혀 사용하지 않는 것이 좋습니다.
글쎄, 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
하지만 컴파일해야 PHP
및 SQLite
확장. SQLite
데이터베이스 파일을 즉시 해독 / 암호화 하고 파일 내용은 항상 암호화됩니다. 굉장히 유용하다.
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');