确保第三方存储的数据完整性和有效性

时间:2013-12-06 14:59:47

标签: security encryption cloud public-key-encryption verification

我正在处理不受信任的外部存储,需要确保存储提供商不会隐藏查询中的任何记录。

示例:

我有两个可信实体TA和TB,这些实体应该能够改变存储在云/不可信存储中的数据,但没有其他人。 所以我的解决方案我为TA和TB配备了Public-Keys,我有一个数据结构,可以与具有版本的表进行比较

 Ver | Data | Signature       | Signee
  4  |  ... | (AAAAAAAAA)_TA  | TA
  3  |  ... | (ZZZZZZZZZ)_TB  | TB
  2  |  ... | (YYYYYYYYY)_TA  | TA
  1  |  ... | (XXXXXXXXX)_TA  | TA

因此,当我从存储提供程序中检索此类表时,我可以轻松验证 签名并检查签名是否正确,签名是否被允许更改表格。

但是,我还要检查记录的完整性。假设TA上传版本4,但TB只知道版本3之前的所有记录。现在,当TB查询时,存储提供商可能完全拒绝版本4。

由于TA和TB之间没有直接的旁道,因此无法更换当前版本。有没有办法规避这个?

我在考虑定期插入虚拟记录,至少要有一定的时间确定性。但是,这种方法缺乏可伸缩性,会导致大量存储和签名开销。 我正在寻找的实际系统属性是什么(很难找到你不知道名字的研究)?

2 个答案:

答案 0 :(得分:2)

如果问题与记录完整性有关,我建议使用MAC(消息认证码)。在这种情况下,您应该使用对称密钥加密,并且它比加密签名(非对称)更有效。

我想到了两个方向:

  1. 您可以减少问题以记录完整性。如果您要验证特定的重要数据,则可以在存储中创建特定表,以便在每个可信实体更新每个重要变量时进行保存。 重要数据可以是:记录数量(总数,新数据,根据某些类别),最新版本等。 当某人进行影响重要数据的更改时,他会更新空间表中的相关记录,并在记录上签名 - 该记录还包含上次更新的日期。 现在,为了防止不受信任的存储返回旧记录或此类事物,每个受信任方必须每隔一段时间(例如 - 一天)至少更新一次记录 - 记录可能不会更改(仅限于记录),标志将改变(现在标志在以后的日期)。 当实体读取信息时,他可以验证数据是否真实,并且在最多前一天(在该示例中)是真实的。如果返回记录的日期早于一天,则不应考虑。 您可以根据需要更改定期更新的频率。对于此选项,您也可以使用MAC而不是签名(以提高效率)。

  2. 您可以尝试其他策略:您无法验证每次更新的完整性,但如果它试图撒谎,您可以尝试捕获不受信任的存储!您可以通过安排更新和查询来完成此操作。

  3. 最后一件事 - 您写道:

      

    由于TA和TB之间没有直接的辅助通道,所以没有办法   交换当前版本。有没有办法规避这个?

    我相信你的意思是沟通渠道。侧通道是另一回事。如果是我,我会创建这样的沟通渠道来解决问题。顺便说一下,与我描述的第一个选项类似,您可以创建这样一个频道:

    创建一个来自不同实体的消息表,他们在这些消息中宣布他们所做的重要更改,并使用更改日期对其进行签名:

    实体|变化|日期|签名(或MAC)

    与第一个选项一样,每个实体必须在每个预定义的时间段内添加此类消息 - 并且您在实体之间拥有可信任的通信通道。

答案 1 :(得分:2)

如果没有虚拟记录,此问题无法完全解决:

当当前版本为版本3“状态3”时,让我们调用状态,当前版本为版本4“状态4”时调用状态。无论你如何签署这些状态 - 只要攻击者告诉你“状态3是当前状态”(向你展示状态3期间的整个数据库),你就不知道这是真的还是状态同时存在4个。

因此,您 必须定期签署“无更改”更新。您将无法避免签名开销,但您不必存储所有这些。你创建一个单独的“lastupdate”表:

 Signer | Last | Timestamp | Signature
  TA    |  4   | 2013-1... | (TA;4;2013-1...)_TA
  TB    |  3   | 2013-1... | (TB;3;2013-1...)_TB

意思是“Signer TA证实,截至2013-1 ......,我发送的最后一个版本是4”。 如果存储提供商无法向所有签名者显示当前确认他们未发布新版本,则必须假设他隐藏了某些内容(或某些内容已损坏) - 无论哪种方式,数据都不是最新的)。任何新的签名声明都会替换该签名者中较旧的声明,因为它们现在无关紧要。

现在,如果你没有一个版本化的“东西”,但是它们中有很多,你不必每个“东西”都有一个这样的虚拟日志。例如,您可以通过签名者计算所有最新行的哈希(或哈希树)(例如“Thing A,Version 3 Thing B,Version 7. Thing C,Version 2”)然后只需将hash或lastupdate表中哈希树的根。

如果确实想要避免其他签名,并且有些内容会一直更新,则可以在您签名的版本记录的签名中包含哈希和时间戳 - 最新签名的记录这将是新鲜度的充分证明,如果它太旧,你仍然可以使用“lastupdate”表。这不值得复杂,恕我直言。