验证sqlite数据库中的数据未被其他任何人修改(即签署数据)

时间:2012-06-03 00:01:51

标签: .net sqlite system.data.sqlite

我正在使用SqlLite数据库,我想确保数据未在应用程序之外进行修改。 (签署数据)

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

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

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

另一种选择是加密数据库,但这并不理想,因为我们希望第三方能够读取数据,而不是修改数据。

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

1 个答案:

答案 0 :(得分:0)

我认为你无能为力。在第一道防线中你可以设置一些触发器

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哈希值,如果哈希值不匹配,则拒绝使用数据库,但这通常是无用的。

简而言之,如果数据库是可读的,那么你就无法阻止那些有足够动力篡改它的人。攻击者可以无限制地转储然后在新数据库中恢复数据。