安全关键应用程序 - 数据库行验证

时间:2010-11-16 04:59:47

标签: .net sql-server hash safety-critical

这可能有点含糊不清,但我希望在所有人中,有些人会遇到这类问题。

背景
我们的应用程序是一个控制列车订单的C#/ .NET服务。我们使用LINQ-to-SQL来存储铁路网络的状态并在SQL Server 2005数据库中训练订单 我们有一个安全要求,即COTS软件本身不能“信任”。

要求
因此,风险被捕获为:“SQL服务器或操作系统修改静态或动态数据。”
我们的任务:“存储在数据库中的数据应经过验证,以便在读取时可以通过数据访问代码确认自上次提交后它没有发生变化。”

问题
我很想找到满足这一要求的“自动化”方式 如果失败了,那就是一种满足条件的方法,而不必在数据库的每个表中创建列来存储计算的哈希值(我们在阅读时必须对其进行验证。)

2 个答案:

答案 0 :(得分:1)

可能类似于MD5校验和,它保存在与主数据相同或不同的表中。校验和将由您的C#应用​​程序生成,因此如果有人使用原始SQL进行更新,则校验和将会关闭。

答案 1 :(得分:1)

  

阅读时可以通过确认   它没有的数据访问代码   自上次提交以来已更改。

这是微不足道的。在除快照之外的所有非脏读隔离级别下,读取的数据是最后提交的数据。根据定义,自上次提交以来它没有改变(换句话说,如果它已经改变,则新值 是最后一次提交)。意外更改(因为要求提及“操作系统修改数据”)称为“数据损坏”,由page checksumTDE捕获。

也许真正的要求是,自从读入应用程序以来,数据库中的值没有改变?然后是Optmistic Concurency Control,这就是它的全部内容。只需将每个“旧”值添加到UPDATE WHERE子句中,它就会自行处理。如果您没有更新任何行(并且您将通过检查@@ ROWCOUNT或使用OUTPUT子句来了解它),那么您就知道该行已更改。 Proactive caching也可以部署。