다음을 통해 공유


암호화

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