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

wor*_*nga 10 cloud security encryption verification public-key-encryption

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

例:

我有两个可信实体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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Jan*_*bal 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
Run Code Online (Sandbox Code Playgroud)

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

现在,如果您不只有一个版本化的“事物”,而是大量版本的“事物”,则不一定必须为每个“事物”拥有一个这样的虚拟日志。例如,您可以计算签名者所有最新行的哈希(或哈希树)(例如“事物 A,版本 3。事物 B,版本 7。事物 C,版本 2。”),然后只需将hash 或最后更新表中哈希树的根。

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