.net - 验证sqlite数据库中的数据未被其他人修改(即对数据签名)

标签 .net sqlite system.data.sqlite

我正在使用SqlLite数据库,并且我想确保未在应用程序外部修改数据。 (签名数据)

sqlite是否保留数据的最后修改日期?

我当时正在考虑使用Windows的上次修改文件日期,但这是我的第二选择。我希望sqlite有办法告诉我数据的哈希值或最后修改的数据的时间戳。

一种选择是计算数据库文件字节的所有内容的哈希值,这将使我保证文件未被任何人修改。但这很昂贵,我希望找到一种更好的方法来验证没有外部源修改数据库。

另一个选择是对数据库进行加密,但这不是理想的方法,因为我们希望第三方能够读取数据,而不是对其进行修改。

请注意,我正在Windows 7上的WPF .net客户端应用程序中使用System.Data.Sqlite访问数据库。

最佳答案

我认为您无能为力。在第一道防线中,您可以放置​​一些触发器

CREATE TRIGGER before_ins_on_table1 BEFORE INSERT ON table1
BEGIN SELECT RAISE( FAIL, 'Not allowed.' ) ; END;

CREATE TRIGGER before_del_on_table1 BEFORE DELETE ON table1
BEGIN SELECT RAISE( FAIL, 'Not allowed.' ) ; END;

CREATE TRIGGER before_upd_on_table1 BEFORE UPDATE ON table1
BEGIN SELECT RAISE( FAIL, 'Not allowed.' ) ; END;


但...

您可以对数据库进行数字签名,也可以在程序中嵌入SHA1哈希,如果哈希不匹配,则拒绝使用数据库,但这通常是没有用的。

简而言之,如果数据库是可读的,则您无法采取任何措施阻止有足够动机来篡改数据库的人。攻击者可以简单地转储然后将数据还原到新数据库中而不受限制。

关于.net - 验证sqlite数据库中的数据未被其他人修改(即对数据签名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10866875/

相关文章:

.net - 是否有任何 .NET ORM 使用构造函数 "properly"?

c# - C# 中是否可以使用基于堆栈的数组?

c# - 正确包含 x32 或 x64 System.Data.SQLite.dll 文件

sql - 两列总计不起作用

c# - 在 Table<> 上的 Lambda Where() 中使用联接的任何方法?

.net - 您能解释一下为什么 DirectoryInfo.GetFiles 会产生这个 IOException 吗?

sql - 在 SQL 中,在 where 语句中返回值时 "IS"和 "="之间有区别吗?

python - 我如何从 sqlite3_table WHERE column_name IN 变量元组中进行选择?

android - 在 Android 的连续 Activity 中使用相同的数据库而不会发生内存泄漏

c# - SQLiteConnection.BeginTransaction 是否在数据库锁定时重试?