암호화

SQLite는 기본적으로 데이터베이스 파일 암호화를 지원하지 않습니다. 대신 SQLCipher, SQLiteCrypt 또는 wxSQLite3과 같은 수정된 버전의 SQLite를 사용해야 합니다. 이 문서에서는 SQLCipher의 지원되지 않는 오픈 소스 빌드를 사용하는 방법을 보여 주지만, 다른 솔루션도 일반적으로 동일한 패턴을 따르기 때문에 이 정보를 적용할 수 있습니다.

설치

dotnet remove package Microsoft.Data.Sqlite
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher

암호화에 다른 네이티브 라이브러리를 사용하는 방법에 대한 자세한 내용은 사용자 지정 SQLite 버전을 참조하세요.

키 지정

새 데이터베이스에서 암호화를 사용하려면 Password 연결 문자열 키워드를 사용하여 키를 지정합니다. SqliteConnectionStringBuilder를 사용하여 사용자 입력의 값을 추가 또는 업데이트하고 연결 문자열 삽입 공격을 방지합니다.

var connectionString = new SqliteConnectionStringBuilder(baseConnectionString)
{
    Mode = SqliteOpenMode.ReadWriteCreate,
    Password = password
}.ToString();

중요한

사용 가능한 가장 안전한 인증 흐름을 사용하는 것이 권장됩니다. Azure SQL에 연결하려는 경우, 권장되는 인증 방법은 Azure 리소스에 대한 관리 ID입니다.

팁

기존 데이터베이스를 암호화하고 암호를 해독하는 방법은 사용 중인 솔루션에 따라 달라집니다. 예를 들어 SQLCipher에서는 sqlcipher_export() 함수를 사용해야 합니다. 자세한 내용은 솔루션 설명서를 참조하세요.

데이터베이스 키 다시 입력

암호화된 데이터베이스의 키를 변경하려면 PRAGMA rekey 문을 실행합니다.

아쉽지만 SQLite는 PRAGMA 문에서 매개 변수를 지원하지 않습니다. 대신 quote() 함수를 사용하여 SQL 삽입을 방지합니다.

var command = connection.CreateCommand();
command.CommandText = "SELECT quote($newPassword);";
command.Parameters.AddWithValue("$newPassword", newPassword);
var quotedNewPassword = (string)command.ExecuteScalar();

command.CommandText = "PRAGMA rekey = " + quotedNewPassword;
command.Parameters.Clear();
command.ExecuteNonQuery();