【问题标题】:Open Encrypted Sqlite Database With Microsoft.Data.Sqlite Created By System.Data.Sqlite使用 System.Data.Sqlite 创建的 Microsoft.Data.Sqlite 打开加密的 Sqlite 数据库
【发布时间】:2021-05-01 14:17:24
【问题描述】:

我有一个使用 System.Data.Sqlite 包和 ChangePassword 方法使用密码创建的数据库。

是否可以使用 Microsoft.Data.Sqlite 包打开这个数据库?我试过使用这里描述的 sqlcipher 包: https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/encryption?tabs=netcore-cli 但我得到了错误:

Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 26: 'file is not a database'.
   at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
   at Microsoft.Data.Sqlite.SqliteCommand.<PrepareAndEnumerateStatements>d__64.MoveNext()
   at Microsoft.Data.Sqlite.SqliteCommand.<GetStatements>d__54.MoveNext()
   at Microsoft.Data.Sqlite.SqliteDataReader.NextResult()
   at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
   at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader()
   at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
   at Microsoft.Data.Sqlite.SqliteConnectionExtensions.ExecuteNonQuery(SqliteConnection connection, String commandText, SqliteParameter[] parameters)
   at Microsoft.Data.Sqlite.SqliteConnection.Open()

我的连接字符串如下所示:

Data Source=<full path to db>;Password=<password>

更多信息: Microsoft.Data.Sqlite.Core 包 5.0.2 SQLitePCLRaw.bundle_e_sqlcipher 包 2.0.4

我也尝试过不在连接字符串中指定密码,而是在打开连接字符串后的 pragma 语句中指定密码,如下所述: https://www.bricelam.net/2016/06/13/sqlite-encryption.html

但我得到了同样的错误。

 SqliteConnection liteConnection = new SqliteConnection(this.ConnectionString);  
            liteConnection.Open();
            using (var command = liteConnection.CreateCommand())
            {
                command.CommandText = "SELECT quote($password);";
                command.Parameters.AddWithValue("$password", _password);
                var quotedPassword = (string)command.ExecuteScalar();
                Console.WriteLine(quotedPassword);
                command.CommandText = "PRAGMA key = " + quotedPassword;
                command.Parameters.Clear();
                command.ExecuteNonQuery();
            }

【问题讨论】:

    标签: sqlite sqlite-net microsoft.data.sqlite


    【解决方案1】:

    尝试使用来自SQLCipher 的cipher_migrate。也许你有不同的密码版本

                        connection.Open();
                        using var command = connection.CreateCommand();
                        command.CommandText = $"PRAGMA key = {DatabaseKey};PRAGMA cipher_migrate;";
                        command.Parameters.Clear();
                        command.ExecuteNonQuery();
    

    【讨论】:

    • 感谢您的建议,不幸的是我遇到了同样的错误
    猜你喜欢
    • 2018-08-09
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多