结合数据分片与加密保护数据隐私
在如今的数字化时代,数据隐私保护变得愈发重要。将数据分片与加密技术相结合,能够在一定程度上保护数据隐私。接下来,我们将深入探讨相关的问题及解决方案。
1. 最小成本问题的NP难性质
最小成本问题和问题4.1、4.2一样,是NP难问题,这一点由下面的定理正式表述:
定理4.11
:最小成本问题是NP难问题。
证明
:该证明是通过从NP难的最小命中集问题进行归约得到的。最小命中集问题可以表述为:给定集合S的子集集合C,找到S的最小子集S′,使得S′包含C中每个子集的至少一个元素。
将命中集问题归约到最小成本问题的定义如下:设S′是最小命中集问题的解,设R = S是一个仅由二进制属性组成的关系,其中0和1值均匀分布,设Q是系统的查询工作负载。
在证明定理4.8时,我们只考虑C中基数大于1且不存在s j ∈C,s j ⊂ s i 的集合s i 。设C f = {s ∈C: |s| > 1且∀s′ ∈C, s′ ̸⊂ s}为关联约束集,设A f = {a∈R: {a}̸∈C}为要分片的属性集。我们注意到,约束集C f 的构建在C上是多项式时间的。而且,通过构造,C f 定义明确且不包含单元素约束。
现在假设Q = {Q},其中Q = “SELECT * FROM R WHERE ∧ ai∈A f (ai = 0)” 且freq(Q) = 1。由于属性值均匀分布,Q中所有条件的选择性相同。因此,对于任意片段F,Q的成本与该片段中的属性数量成正比。在分片F中,使给定查询成本最小的片段F是包含最多属性的片段。如定理4.8的证明所述,计算具有最大基数的片段对应于解决最小命中集问题,因为S′ = R - F。
2. 最小化查询成本执行的启发式方法
前面章节提出的两种启发式算法不适合解决问题4.3,因为它们没有考虑到将明文属性集放在同一片段中所带来的优势。由于上一节引入的成本函数相对于支配关系具有单调性(见引理4.4),第4.5节提出的完全搜索算法也可用于计算问题4.3的解。在这种情况下,函数Evaluate应实现Cost(Q, F)函数。然而,完全搜索算法在属性数量上仍然是指数级的。虽然这对于小模式可能不是问题,但对于复杂模式可能会使该算法不可用。因此,我们提出一种多项式时间的启发式算法。
2.1 使用成本函数计算向量最小分片
我们的启发式方法基于为完全搜索提出的深度优先搜索算法的一个变体,其中组成分片树的选定子树按照为完全搜索算法提出的相同策略进行访问。如图4.14所示,分片格在逻辑上被划分为 ⌈n/d⌉ 个带,其中:
- n是A f 的基数;
- d是一个参数,表示每次完全访问树的层数;
- ps是一个参数,表示每次探索的有前途的分片数量。
深度为d的第一个子树以格的顶部元素F ⊤ 为根顶点构建。在级别x·d,访问ps个子树(其中ps是启发式算法的另一个参数),以在级别x·d计算的分片中的一个为根。这些访问在级别(x + 1)·d人为停止,在那里选择最佳的ps个解作为下一次深入访问解空间的根。
图4.15中的函数以要分片的属性集A f 、定义明确的非单元素约束集C f 以及d和ps作为额外参数。它通过访问F中的一部分分片,计算A f 的向量最小分片Min。
算法使用以下变量:
- marker[F],表示标记在分片F中的位置;
- Min,表示当前的最小分片;
- MinCost,表示组成Min的片段数量;
- currentqueue,包含在级别x·d的最佳ps个分片,这些分片是要访问的子树的根;
- nextqueue,按成本递增顺序包含由以currentqueue中的解为根的子树访问计算出的在级别(x + 1)·d的正确分片。
以下是该算法的代码:
FRAGMENT(Af ,Cf ,d,ps)
nextqueue:= NULL /* priority queue of promising solutions */
currentqueue:= NULL /* queue containing the best ps solutions */
for each ai∈Af do F⊤
i
:= {ai} /* root of the search tree F ⊤*/
marker[F ⊤] := 1 /* next fragment to be merged */
Min := F ⊤/* current minimal fragmentation */
MinCost := Cost(Q,Min)
/* compute the best ps solution within d levels from F ⊤*/
insert(nextqueue,Min,MinCost)
while nextqueue̸=NULL do
i := 1
while (i≤ps)∧(nextqueue̸=NULL) do
i := i+1
enqueue(currentqueue,extractmin(nextqueue))
nextqueue := NULL
while currentqueue̸=NULL do
F := dequeue(currentqueue)
marker[F ] := 1
BoundedSearchMin(F ,d)
return(Min)
BOUNDEDSEARCHMIN(F p,dist)
localmin := true /* minimal correct fragmentation */
for i=marker[F p]...(|F p|-1) do
for j:=(i+1)... |F p| do
if F p
i .last<AF p
j .first then /* F p
i fully precedes F p
j */
for l=1... |F p| do
case:
(l<j ∧l̸=i): Fc
l := F p
l
(l>j):
Fc
l−1 := F p
l
(l=i):
Fc
l := F p
i F p
j
marker[F c] := i
if SatCon(Fc
i ) then
localmin := false
if dist= 1 then
insert(nextqueue,F c,Cost(Q,F c))
else
BoundedSearchMin(F c,dist−1) /* recursive call */
if localmin then
cost := Cost(Q,F p)
if cost<MinCost then
MinCost := cost
Min := F p
算法开始时,将变量Min初始化为F ⊤ ,将变量MinCost初始化为F ⊤ 的成本。然后,算法对F ⊤ 调用函数BoundedSearchMin,该函数根据定义4.11迭代构建F ⊤ 的子节点。仅当子节点F c 满足所有约束(即函数SatCon返回true)且未达到级别d时,才对F c 递归调用函数BoundedSearchMin(F p)。在后者情况下,如果F c 正确,则将其插入nextqueue。注意,该函数利用了所采用的成本函数的单调性,并且仅当F p 是局部最小(即它没有正确的子节点)时,才将F p 的成本与Min进行比较。
当以F ⊤ 为根的子树被访问后,nextqueue中的前ps个分片成为currentqueue的内容,并且nextqueue重新初始化为NULL。然后对currentqueue中的每个F调用函数BoundedSearchMin,但将F的标记移回其第一个片段。标记的重新初始化意味着,对于每个子树的根分片F,格中表示F子节点的所有分片都会被重新评估,但可能不是按照完全搜索所采用的基于顺序的覆盖方式。我们注意到,这种策略可能会多次访问格中的同一个顶点。然而,一个分片最多可以生成ps次。当currentqueue为空时,它将被nextqueue中的前ps个分片替换,直到到达树的最后一层。
示例4.9 :图4.16逐步说明了将函数BoundedSearchMin(简称Bounded)应用于示例4.1的执行过程,假设d = 1且ps = 2。图4.16(a)中的表格描述了每次对BoundedSearchMin的(递归)调用时变量以及nextqueue的更新情况。因此,图4.16(a)中的表格与图4.7(a)中的表格结构相同,只是最后一列专门用于nextqueue,并且用于表示解中片段数量的列在这里被解的成本所取代。图4.16(b)说明了算法访问的格的部分。开始时,变量Min初始化为[N|O|S|Z],它是树的根分片,成本MinCost初始化为20,并且nextqueue最初为空。首先,对[N|O|S|Z]调用函数BoundedSearchMin,dist = 1。由于dist - 1为0,从[N|O|S|Z]生成且满足约束的分片不会导致对BoundedSearchMin的递归调用,但在评估其成本后会将它们插入nextqueue。然后,对从nextqueue中提取的前两个分片,即[N|O|SZ]和[N|OZ|S],调用BoundedSearchMin。启发式算法计算的最终分片与SearchMin计算的相同。
2.2 正确性和复杂性
现在我们评估图4.15中函数Fragment的正确性和复杂性。
定理4.12(正确性)
:图4.15中的函数Fragment终止并找到一个向量最小分片(定义4.12)。
证明
:如果组成函数Fragment的所有while循环都终止,则该函数终止。外部while循环在nextqueue为空时终止,前提是两个内部循环终止。第一个内部循环终止,因为变量i在每一步增加1。当i > ps时,它终止。第二个内部while循环终止,因为在每次迭代中,从currentqueue中提取一个元素,并且函数BoundedSearchMin终止。实际上,函数BoundedSearchMin在每次递归调用时,将父节点中的两个片段合并以计算其子节点,并且递归终止,因为每次调用时dist减少1。由于BoundedSearchMin终止,插入nextqueue的项数是有限的。此外,分片树的层数是有限的。因此,nextqueue变为空,Fragment终止。
现在我们证明,该函数在A f 和C f 上计算的解F是一个向量最小分片。根据最小性的定义4.12,一个分片F是向量最小的,当且仅当(1)它是正确的,(2)它最大化可见性,并且(3)不存在F ′: F ≺ F ′满足上述两个条件。前两个属性直接来自定理4.4的证明,因为函数BoundedSearchMin在生成候选解时的工作方式与SearchMin完全相同。我们只需要证明第三个属性。
通过反证法,假设存在一个满足C f 中约束并最大化可见性的分片F ′,使得F ≺ F ′。设V F 和V F ′分别是与F和F ′相关联的片段向量。如定理4.6的证明中已经证明的,F ′包含一个片段V F ′[ai],它是F的两个不同片段V F [ai]和V F [a j]的并集。我们需要证明函数Fragment不能以两个不同片段的并集不违反任何约束的情况终止。
调用BoundedSearchMin(F, dist)时有两种不同的情况,即dist > 1或dist = 1。在第一种情况下,生成F ′并调用BoundedSearchMin(F ′, dist - 1)。在第二种情况下,生成F ′并将其插入nextqueue。由于nextqueue是一个有序队列,仅当成本低于nextqueue的解不超过ps个时,才会调用BoundedSearchMin(F ′, dist)。但如果F作为Fragment的解返回,则nextqueue中没有成本低于F的解,因为对每个F ′′ ∈ nextqueue都会调用BoundedSearchMin(F ′′)。这产生了一个矛盾,因为根据引理4.4,Cost(Q, F ′) ≤ Cost(Q, F)。
因此,图4.15中的函数Fragment计算的解F是一个向量最小分片。
定理4.13(复杂性)
:给定一组约束C = {c1, …, cm}、一组属性A = {a1, …, an}以及两个参数d和ps,图4.15中函数Fragment(A, C, d, ps)的时间复杂度为O( ps/d n2d + 2m)。
证明
:函数Fragment中外部while循环的最大迭代次数为O( n/d),因为分片树由n层组成,并且在每次迭代中,插入nextqueue的解比当前nextqueue中的解低d层。对于currentqueue中的每个F p ,递归调用函数BoundedSearchMin(F p, d),currentqueue最多包含ps个解,因为它是在前一个while循环中填充的。函数BoundedSearchMin的行为与函数SearchMin类似,它访问以F p 为根的子树中d层内的解。因此,每次递归调用BoundedSearchMin(F p, d)构建的解的数量为O(n2d),并且每个生成的解都与C中的约束进行比较。因此,总体时间复杂度为O( ps/d n2d + 2m)。
3. 查询执行
关系R的分片意味着在查询执行时,仅使用为满足机密性约束而存储的片段,而不是原始关系。这些片段可以存储在单个服务器或多个服务器上。存储片段的服务器(或多个服务器)在机密性方面不需要被信任,因为访问单个片段或加密信息不会导致任何隐私泄露,但它被信任能够正确评估片段上的查询(诚实但好奇)。
无权访问原始关系R内容的用户对数据只有部分视图,这意味着他们只能访问片段。具有部分视图的用户提交的查询可以直接提交给存储所需片段的服务器。有权访问原始关系内容的用户对数据有完整视图,可以提交引用原始关系模式的查询。具有完整视图的用户发出的查询随后会被转换为对存储在服务器上的加密和分片数据进行操作的等效查询。这个转换过程由一个可信组件(称为查询映射组件)执行,每当需要访问敏感信息时就会调用该组件。
具体来说,查询映射组件接收具有完整视图的用户提交的查询Q以及可能需要用于解密服务器计算的查询结果的密钥k,并将查询Q的结果返回给用户。由于R的每个物理片段都包含R的所有属性,无论是加密形式还是明文形式,因此响应Q最多只需访问一个片段。因此,查询映射组件将用户的查询Q映射到一个在特定片段上工作的等效查询Q s 。服务器在所需片段上执行接收到的查询Q s ,并将结果返回给查询映射组件。
需要注意的是,每当查询Q可能涉及在所选片段中不以明文形式出现的属性时,查询映射组件可能需要对Q s 的解密结果执行额外的查询Q u ,该查询负责强制执行无法在物理片段上评估的所有条件,或投影查询Q的SELECT子句中报告的属性。在这种情况下,查询映射组件解密接收到的结果,对其执行查询Q u ,并将Q u 的最终结果返回给用户。
下面我们详细描述查询翻译过程:
我们考虑形式为Q = “SELECT A Q FROM R WHERE C” 的SQL查询,其中A Q 是R的属性子集,C是基本条件c 1 … c n 的合取,形式为(a op v) 或 (a j op a k) ,其中a、a j 和a k 是R的属性,v是常量值,op是比较运算符{=, ̸=, >, <, ≤, ≥}。
假设我们要在物理片段 ˆF i (salt, enc, a i1, …, a in) 上评估查询Q,其中salt是主键,enc包含加密属性,a i1, …, a in 是明文属性。为了通用性,假设C包含一些涉及 ˆF i 中以明文形式存储的属性的条件,以及一些无法在 ˆF i 上评估的条件。查询映射组件将原始查询Q转换为在物理片段上操作的查询Q s ,定义如下:
SELECT AQ ∩ {ai1, ..., ain}, salt, enc
FROM
ˆFi
WHERE ∧
c j∈Ce
i c j
其中C e i 是C中可以在物理片段 ˆF i 上评估的基本条件集,即C e i = {c j : c j ∈C ∧ attributes(c j) ∈ ˆF i } ,其中attributes(c j) 表示c j 中出现的属性。注意,仅当原始查询Q的SELECT或WHERE子句涉及片段中不以明文形式出现的属性时,才会在Q s 的SELECT子句中指定salt和enc属性。
查询映射组件然后解密接收到的元组,并对它们执行查询Q u ,定义如下:
SELECT AQ
FROM
Decrypt(Qs, k)
WHERE ∧
c j∈{C−Ce
i } c j
其中Decrypt(Q s, k) 表示一个临时关系,包括Q s 返回的元组,并且其中的enc属性已通过密钥k解密。Q u 的WHERE子句包括所有定义在物理片段中不以明文形式出现的属性上的条件,这些条件只能在解密结果上评估。最终,查询Q u 的结果将返回给用户。
为了最小化查询评估成本,可以使用查询优化器来选择允许服务器执行更具选择性查询的片段,从而减少应用程序的工作量并最大化执行效率。例如,可以方便地选择使Cost(Q, F i ) 最小的物理片段 ˆF i ,如第4.9节所定义。
示例4.10 :考虑图4.1(a)中的关系及其在图4.2中的片段。假设我们有一个查询Q,用于检索患有“Latex al.”疾病且邮政编码为“94140”的患者的社会安全号码和姓名。由于片段 ˆF 3 同时包含“Sickness”和“ZIP”,它可以评估WHERE子句中的两个条件,因此被选择用于查询评估。图4.18展示了查询的转换过程。
综上所述,通过将数据分片与加密技术相结合,并采用合适的启发式算法和查询执行策略,我们可以在保护数据隐私的同时,有效执行查询操作。
结合数据分片与加密保护数据隐私
4. 关键技术总结
为了更清晰地理解上述内容,我们对关键技术点进行总结:
| 技术点 | 描述 |
| — | — |
| 最小成本问题 | 是NP难问题,通过从最小命中集问题归约证明。 |
| 启发式算法 | 基于深度优先搜索算法变体,用于计算向量最小分片,在多项式时间内工作。 |
| 查询执行 | 利用查询映射组件将用户查询转换为对加密和分片数据的等效查询,必要时执行额外查询。 |
5. 操作步骤梳理
下面我们梳理一下在实际应用中涉及的操作步骤:
1.
最小成本问题求解
- 定义集合S、子集集合C,将最小命中集问题归约到最小成本问题。
- 构造关联约束集C f 和要分片的属性集A f 。
- 假设查询Q和频率,根据属性值分布计算查询成本。
2.
启发式算法执行
- 初始化变量Min、MinCost、currentqueue和nextqueue。
- 对F ⊤ 调用BoundedSearchMin函数,迭代构建子节点。
- 根据约束条件和成本选择最佳分片,更新Min和MinCost。
- 重复上述步骤,直到到达树的最后一层。
3.
查询执行流程
- 具有部分视图的用户直接提交查询到存储片段的服务器。
- 具有完整视图的用户提交的查询由查询映射组件处理:
- 将查询Q映射到等效查询Q s 。
- 服务器执行Q s 并返回结果。
- 若需要,查询映射组件执行额外查询Q u 。
- 将最终结果返回给用户。
6. 流程图展示
下面是查询执行过程的mermaid流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([用户提交查询]):::startend --> B{用户视图类型}:::decision
B -->|部分视图| C(直接提交到服务器):::process
B -->|完整视图| D(查询映射组件):::process
D --> E(映射为Q s):::process
E --> F(服务器执行Q s):::process
F --> G{是否需要额外查询}:::decision
G -->|是| H(查询映射组件执行Q u):::process
G -->|否| I([返回结果给用户]):::startend
H --> I
7. 注意事项与优化建议
在实际应用中,还需要注意以下几点:
-
数据一致性
:在数据分片和加密过程中,要确保数据的一致性,避免出现数据丢失或错误。
-
密钥管理
:妥善管理加密密钥,防止密钥泄露导致数据隐私泄露。
-
性能优化
:可以使用查询优化器选择合适的片段,减少查询执行时间。
同时,我们可以根据实际情况对算法进行优化:
-
调整参数
:根据数据规模和查询特点,调整启发式算法中的参数d和ps,以达到更好的性能。
-
并行处理
:对于大规模数据,可以考虑使用并行处理技术加速查询执行。
8. 总结与展望
通过将数据分片与加密技术相结合,我们可以在保护数据隐私的同时,有效执行查询操作。本文介绍的最小成本问题求解、启发式算法和查询执行方法,为数据隐私保护提供了一种可行的解决方案。
在未来,随着数据量的不断增加和数据隐私要求的提高,我们可以进一步研究和改进这些技术:
-
更高效的算法
:探索更高效的启发式算法,减少计算复杂度。
-
多模态数据处理
:考虑处理多模态数据,如文本、图像和视频,以满足更广泛的应用需求。
-
安全审计
:建立安全审计机制,对数据访问和查询进行监控和审计,确保数据安全。
总之,数据隐私保护是一个长期而重要的课题,我们需要不断探索和创新,以应对日益复杂的安全挑战。
超级会员免费看
884

被折叠的 条评论
为什么被折叠?



