我正在使用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/