首页 文章

密码保护SQLite数据库 . 可能吗?

提问于
浏览
73

我必须面对一个新的小项目 . 它将有大约7或9个表,其中最大的表将以每月1000行的最大速率增长 .

我认为SQLite是我的数据库......但是如果有人想要从数据库中更改数据,我将需要保护数据库

我的主要问题是:

是否有可能像访问时那样用密码保护sqlite db?

对于如此小的解决方案,您会推荐哪些其他RDBMS?

开发将在C#上,但我正在寻找一些免费的东西 .

9 回答

  • 4

    使用SQLCipher,它是SQLite的开源扩展,为数据库文件提供透明的256位AES加密 . http://sqlcipher.net

  • 12

    一个选项是VistaDB . 它们允许数据库(甚至表)受密码保护(并且可选地加密) .

  • 2

    我知道这是一个老问题,但简单的解决方案不是仅仅保护操作系统级别的文件吗?只是阻止用户访问该文件,然后他们就无法触摸它 . 这只是一个猜测,我不确定这是否是一个理想的解决方案 .

  • 3

    您可以使用sqlite .net提供程序(System.Data.SQLite)的内置加密 . 在http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx查看更多详情

    encrypt an existing unencrypted databaseto change the password of an encrypted database ,打开数据库,然后使用SQLiteConnection的ChangePassword()函数:

    // Opens an unencrypted database
    SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
    cnn.Open();
    // Encrypts the database. The connection remains valid and usable afterwards.
    cnn.ChangePassword("mypassword");
    

    decrypt an existing encrypted database 使用 NULL"" 密码调用 ChangePassword()

    // Opens an encrypted database
    SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
    cnn.Open();
    // Removes the encryption on an encrypted database.
    cnn.ChangePassword(null);
    

    要打开现有加密数据库或创建新加密数据库,请在 ConnectionString 中指定密码,如上例所示,或在打开新 SQLiteConnection 之前调用 SetPassword() 函数 . ConnectionString 中指定的密码必须是明文,但 SetPassword() 函数中提供的密码可以是二进制字节数组 .

    // Opens an encrypted database by calling SetPassword()
    SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
    cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
    cnn.Open();
    // The connection is now usable
    

    默认情况下,将另一个数据库文件附加到现有连接时,ATTACH关键字将使用与主数据库相同的加密密钥 . 若要更改此行为,请使用KEY修饰符,如下所示:

    如果使用明文密码附加加密数据库:

    // Attach to a database using a different key than the main database
    SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
    cnn.Open();
    cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
    cmd.ExecuteNonQuery();
    

    使用二进制密码附加加密数据库:

    // Attach to a database encrypted with a binary key
    SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
    cnn.Open();
    cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
    cmd.ExecuteNonQuery();
    
  • 51

    为什么需要加密数据库?用户可以轻松地反汇编程序并找出密钥 . 如果您要对其进行网络传输加密,请考虑使用PGP而不是将加密层压缩到数据库层 .

  • 1

    您可以使用SEE插件加密SQLite数据库 . 这样可以防止未经授权的访问/修改 .

    引用SQLite文档:

    SQLite加密扩展(SEE)是SQLite的增强版本,它使用128位或256位AES加密数据库文件,以帮助防止未经授权的访问或修改 . 整个数据库文件已加密,因此对于外部观察者,数据库文件似乎包含白噪声 . 没有任何东西可以将文件标识为SQLite数据库 .

    您可以在this link中找到有关此插件的更多信息 .

  • 3

    您可以使用密码保护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编辑器查看您的数据 . 如果您提供密码,某些编辑者可以解密数据库 . 使用的算法是RSA .

    稍后如果您想更改密码,请使用

    conn.ChangePassword("new_password");
    

    要重置或删除密码,请使用

    conn.ChangePassword(String.Empty);
    
  • 30

    关于密码保护你的sqlite db的问题,我不认为可以做到 .

    你可以加密它,这里有一些信息:

    http://sqlcrypt.com/

    每个平台149美元 .

  • 2

    如果使用 FluentNHibernate ,则可以使用以下配置代码:

    private ISessionFactory createSessionFactory()
    {
        return Fluently.Configure()
                .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
                .ExposeConfiguration(this.buildSchema)
                .BuildSessionFactory();    
    }
    
    private void buildSchema(Configuration config)
    {
            if (filename_not_exists == true)
            {
                new SchemaExport(config).Create(false, true);
            }
    }
    

    方法UsingFileWithPassword(filename,password)加密数据库文件并设置密码 .
    它仅在创建新数据库文件时运行 . 使用此方法打开时,旧的未加密失败 .

相关问题