SQLite의 암호화 및 암호 보호

Bilal Shahid 2023년6월21일
  1. 암호화란?
  2. SQLite에서 암호를 설정하는 방법
  3. SQLite에서 데이터베이스를 암호화하는 방법
SQLite의 암호화 및 암호 보호

기밀 정보가 있는 대규모 데이터베이스를 처리할 때 이를 잘 숨기고 싶은 것은 매우 자연스러운 일입니다. 한 시스템에 남아 있는 경우 일반적으로 암호로 충분합니다.

그러나 보안되지 않은 네트워크를 통해 전송되는 경우 데이터베이스를 암호화하는 것이 가장 좋습니다.

암호화란?

간단히 말해서 암호화는 데이터를 단순히 읽는 것만으로는 해독할 수 없는 읽을 수 없는 데이터 문자열로 변환하는 프로세스입니다. 암호화하고 해독하려면 키가 필요합니다.

복호화는 읽을 수 없는 데이터를 원래의 형태로 되돌리는 반면, 암호화는 그 반대이며 읽을 수 있는 데이터를 읽을 수 없는 형태로 변환합니다.

데이터는 알고리즘을 기반으로 암호화됩니다. 복잡성은 다양할 수 있으며 일부는 다른 것보다 더 안정적입니다.

따라서 사용하는 암호화 유형은 키 없이 암호 해독을 방지할 수 있을 만큼 충분히 신뢰할 수 있어야 합니다.

SQLite에서 암호를 설정하는 방법

SQLite에서 데이터베이스를 보호하려면 다른 작업을 수행하기 전에 다음 코드를 사용하여 암호를 설정하십시오.

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

다음에 다음을 사용하여 데이터베이스(SQLite 버전 3에서)에 액세스할 수 있습니다.

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

다음과 같이 비밀번호를 재설정할 수도 있습니다.

conn.ChangePassword("new_password");

비밀번호 대신 String.Empty 절을 추가하면 비밀번호를 제거할 수 있습니다.

SQLite에서 데이터베이스를 암호화하는 방법

데이터를 암호화하기 위해 여러 가지 방법을 채택할 수 있습니다. 거의 모두가 완전히 안전하고 데이터를 성공적으로 암호화할 수 있는 일부 확장 프로그램이나 소프트웨어를 사용합니다.

다음은 몇 가지 신뢰할 수 있는 옵션입니다.

SQLite 암호화 확장(SEE)

This는 SQLite 전용 표준 암호화 서비스입니다. SQLite에서 암호화된 파일과 암호화되지 않은 파일 모두에서 읽고 쓸 수 있습니다.

또한 ATTACH 명령을 사용하여 SEE를 사용하여 두 개 이상의 파일을 동시에 작업할 수도 있습니다.

이 확장 프로그램에서 파일을 암호화하는 것은 매우 간단합니다. 아래 코드를 사용하여 그렇게 할 수 있습니다.

int sqlite3_key
(
   sqlite3 *db,
   const void *e_key,
   int key_size
);

여기서 첫 번째 행은 사용된 데이터베이스를 나타내고 두 번째 행은 암호 해독에 사용된 키를 나타내며 마지막 행은 키를 저장하는 데 사용된 바이트 수를 나타냅니다.

다음 코드를 사용하여 데이터베이스의 키를 변경할 수도 있습니다.

int sqlite3_rekey
(
   sqlite *db,
   const void *e_key, int key_size
);

여기서 첫 번째 행은 데이터베이스를 나타내고 두 번째 행에는 새 키와 키의 전체 크기가 포함됩니다.

NULL 키를 지정하여 이전에 암호화된 데이터베이스를 해독하기 위해 sqlite3_rekey()를 사용할 수도 있습니다.

이것이 SEE가 전체 데이터베이스의 데이터와 메타데이터를 암호화하는 방법입니다. 그러나 이것은 현재 무료로 제공되지 않는다는 점에 유의해야 합니다.

wxSQLite

암호화 서비스는 모두에게 열려 있습니다. 공개 도메인 SQLite 데이터베이스 주변의 C++ 래퍼로 간주될 수 있습니다.

이것과 다른 점은 wxSQLite가 기본 데이터베이스를 숨기려고 시도하지 않는다는 것입니다. 대신 wxStringsUTF-8 문자열 간의 자동 변환을 통해 모든 기능을 지원하고 UTF-8 코딩으로 모든 기능을 개별적으로 암호화합니다.

다른 ANSI 빌드의 경우 현재 로케일 변환 개체 (wxConvCurrent)가 변환에 사용됩니다. 그러나 외부 관리 도구를 사용하여 데이터베이스를 수정하는 경우 문제가 발생할 수 있다는 점에 유의해야 합니다.

이 키 기반 암호화를 사용하면 런타임에 선호하는 암호화 체계를 선택할 수 있습니다.

SQLCipher

SQLCipher는 SQLite용 오픈 소스 확장입니다. 요구 사항에 따라 안전한 암호화 서비스를 제공합니다.

예를 들어 “Community”, “Commercial” 및 “Enterprise"와 같은 다양한 패키지를 제공합니다. 각각은 추가 기능에 대한 비용을 지불하지 않고 필요한 기능을 제공하도록 설계되었습니다.

‘SQLCipher’는 성능이 우수하고 설치 공간이 작아 임베디드 애플리케이션 데이터베이스 보호에 적합하며 모바일 개발에 적합합니다. 그 기능은 다음과 같습니다.

  1. 5-15%의 오버헤드 암호화만 있습니다. 이것은 빠른 암호화를 제공한다는 것을 의미합니다.
  2. 전체 데이터베이스가 암호화됩니다.
  3. 보안 사례에는 CBC 모드 및 키 파생이 포함됩니다.
  4. 애플리케이션 수준의 암호화를 제공합니다.
  5. 피어 리뷰 OpenSSL 암호화 라이브러리는 알고리즘을 제공합니다.
  6. 여러 플랫폼을 지원합니다.

SQLiteCrypt

서비스는 SQLite와 동일한 AESAES 256 암호화 지원을 사용하여 너무 많은 속도를 손상시키지 않습니다. 실제로 사용자에게는 평소처럼 빠르게 보일 것입니다.

다음은 제공하는 기능 중 일부입니다.

  1. 엄청나게 빠릅니다.
  2. SQLite 런타임을 교체하고 2 PRAGMA를 추가하기만 하면 됩니다.
  3. 한 번에 하나의 블록을 해독하므로 해커도 메모리 덤프에서 아무것도 얻을 수 없습니다.
  4. 제로 구성으로 간단한 프로세스로 암호화가 가능합니다.

사용하는 pragma 문은 아래에 언급되어 있습니다.

PRAGMA key = 'the passphrase'
PRAGMA lic = 'the license key'
PRAGMA rekey = 'new passphrase'

첫 번째는 암호화된 데이터베이스를 생성하는 것이고, 두 번째는 SQLiteCrypt 소프트웨어의 적법한 사본을 식별하는 것이며, 마지막은 새로운 암호로 데이터베이스를 다시 작성하는 것입니다.

스퀘어

Sqleet는 최적의 보안을 위한 고급 알고리즘을 기반으로 하는 투명한 암호화 서비스입니다. 강력한 사이드 채널 저항과 높은 소프트웨어 성능을 제공합니다.

크로스 컴파일 및 크로스 플랫폼 개발을 용이하게 하는 종속성이 없기 때문에 컴파일이 간단합니다.

다음과 같이 sqleet 암호화 지원으로 SQLite3 셸을 컴파일할 수 있습니다.

  1. 유닉스 - % gcc sqleet.c shell.c -o sqleet -lpthread -ldl
  2. Windows - % gcc sqleet.c shell.c -o sqleet

시스템.데이터.SQLite

This는 암호화를 제공하는 .NET 라이브러리입니다. 관련 패키지를 다운로드한 후 SQLite.Interop.dll을 추출하고 sqlite3.dll로 이름을 바꿉니다.

일반 텍스트 암호 또는 암호화 키로 암호화합니다.

함수 생성 루틴

SQLite의 함수 생성 루틴을 사용할 수도 있습니다.

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

이제 데이터베이스를 쉽게 암호화하고 암호를 추가할 수 있습니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub