【问题标题】:Safety critical app - Database row validation安全关键应用程序 - 数据库行验证
【发布时间】:2011-05-10 15:11:12
【问题描述】:

这可能有点模糊,但我希望在 SO 的所有人中,会有一些人之前遇到过此类问题。

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

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

问题
我很想找到一种“自动”的方式来满足这一要求。
如果做不到这一点,则无需在数据库的每个表中创建列来存储计算的哈希值即可满足条件(然后我们必须在读取时对其进行验证。)

【问题讨论】:

  • COTS 软件肯定会实现任何满足此要求的“自动”方式,从而产生悖论?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在阅读时可以确认 它没有的数据访问代码 自上次提交以来发生了变化。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2016-06-15
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多