26、数据库取证中的重建技术探索

数据库取证中的重建技术探索

1. 引言

在数字取证调查中,数据库往往蕴含着至关重要的信息。例如,在某零售业务中,因大量商品以极低折扣价出售导致巨额亏损,被怀疑的销售人员坚称商品是按数据库中当日的官方价格销售。为验证这一说法,就需要确定该商品在特定日期的销售价格。然而,自该日期以来数据库可能经历了多次更新,调查人员必须逆转所有影响该商品销售价格的数据库事务(查询)。

传统上,虽然对查询处理的研究广泛,但反向查询处理或计算查询逆运算的研究却相对较少。目前这方面的工作主要集中在测试数据库生成、性能评估以及数据库应用程序和 SQL 查询的调试上,这些方法生成的测试数据库无法用于取证目的,因为它们具有非确定性。

为解决这一问题,我们引入了一种利用逆关系代数运算符、关系代数日志(RA 日志)和关系值块进行数据库重建的算法,以下将详细介绍相关内容。

2. 背景知识
2.1 关系数据库模型

关系数据库模型由 Codd 提出,它基于集合论和关系来存储和操作数据。在该模型中,唯一的复合数据类型是关系。给定一组与属性集相关联的域,关系 R 被定义为这些域的笛卡尔积的子集,可将其视为一个表格,列是属性,行是元组,域定义了属性的数据类型。

关系代数包含用于操作关系的基本运算符和关系赋值运算符(←)。基本运算符可将一个或两个关系转换为新关系,这些转换称为关系值表达式(rve),查询可定义为 T ← rve,其中 T 是 rve 求值得到的关系。基本关系运算符如下表所示:
| 运算符 | 符号表示 |
| — | — |
| 笛卡尔积(×) | T ← R × S |
| 并集(∪) | T ← R ∪ S |
| 交集(∩) | T ← R ∩ S |
| 差集(−) | T ← R − S |
| 除法(/) | T ← R[A, B/C]S |
| 连接(⋊⋉) | T ← R[p(A, B)]S
T ← R ⋊⋉p(A,B) S |
| 投影(π) | T ← R[A1, A2, A3]
T ← πA1,A2,A3(R) |
| 选择(σ) | T ← R[p(A)]
T ← σp(A)(R) |

SQL 查询可以用关系代数表示,因为关系数据库使用关系代数进行查询的内部表示、优化和执行。而且,关系代数运算符可以独立使用,一个或多个运算符可以组合表示另一个操作,例如 R ∩ S = R − (R − S) 和 R ⋊⋉p(A,B) S = σp(A,B)(R × S)。我们将数据库的查询日志表示为一系列关系操作,即关系代数日志(RA 日志)。

2.2 关系代数日志和值块

关系代数日志(RA 日志)是将查询表示为涉及关系代数运算符的操作日志,而非传统的 SQL 表示法。它有助于确定关系何时发生变化,基于关系代数,只有当对关系进行新的赋值操作时,关系才会改变,这使得 RA 日志可以被分组为一组重叠的值块。

使用 RA 日志而非常规 SQL 日志文件的另一个原因是,关系代数允许将查询表示为涉及关系代数运算符的一元和二元操作序列,使日志文件更易读。此外,由于 SQL 日志文件中的典型选择语句可能有多种形式,使用 RA 日志可以消除为选择语句定义逆运算时可能出现的歧义,因为任何选择语句都可以用关系代数运算符表示。

值块被定义为一组查询,在这些查询中特定关系保持不变。值块根据其中保持不变的关系命名,并使用下标表示块的时间顺序。值块以赋值或重命名操作开始,在对该关系进行另一次赋值或重命名操作之前结束。例如,关系 R 的值块表示为 VRi(i = 1, 2, …)。关系 R 在块 VR1 的执行过程中保持不变,直到块 VR2 的第一个查询执行更新它。一个关系的值块可以包含或重叠另一个关系的值块,但同一关系的两个值块不能重叠或成为另一个的子集。RA 日志中保留每个查询的时间戳,以确保值块的正确顺序。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(开始):::process --> B(查询日志):::process
    B --> C(转换为RA日志):::process
    C --> D(分组为值块):::process
    D --> E(结束):::process
2.3 数据库取证

尽管数字取证和数据库理论备受关注,但数据库取证领域的研究相对较少。数据库取证的主要目标之一是逆转数据操作并确定数据库在早期时间点包含的值。虽然有一些关于 Oracle 数据库取证的研究,但这些研究并未专门解决数据库取证的基础理论或为取证目的逆转数据操作的问题。

3. 逆关系代数

逆关系代数运算符可用于获取关系 R 中元组的属性 A 在时间 t 的值。通过顺序计算对当前关系 Rt 执行的最近查询的逆运算,直到达到所需时间 t。这些运算符假设数据库模式已知,并生成查询的部分或完全逆运算结果。形式上,查询 Q 的逆运算定义为 Q−1,使得 Q−1(Q(Rt)) = R∗t,其中 R∗t ⊆ Rt,即 R∗t 包含在 Rt 中。完全逆运算满足 R∗t = Rt,否则为部分逆运算。部分逆运算根据缺少元组还是某些列缺少值,分为部分元组逆运算和部分列逆运算,也存在同时属于这两种情况的逆运算。

3.1 完全逆运算符

关系代数中只有两个逆运算符总是生成完全逆运算结果。
- 逆重命名(ρ−1)运算符 :仅更改关系的名称,不改变关系中的数据。例如,若查询 A ← ρA1=B2(A) 将关系 A 中列 A1 的名称更改为 B2,则该操作的逆运算为 ρ−1(A) = ρB2=A1(A)。
- 逆笛卡尔积(×−1)运算符 :给定表示两个关系 R(A) 和 S(B) 笛卡尔积的关系 T,×−1(T) 的结果(即 R 和 S)可以通过对其各自属性进行投影并去除冗余元组来完全确定,即 ×−1(T) = (R, S),其中 R = πA(T),S = πB(T)。当笛卡尔积的一个操作数为空关系时,这是一种特殊情况,在此情况下,无法从逆运算中确定第二个操作数,但这种情况在实际中很少发生。

3.2 部分逆运算符

大多数逆运算符被归类为部分逆运算符,但在某些情况下可以找到完全逆运算。以下是剩余逆运算符的定义以及它们产生完全逆运算的情况:
- 逆投影(π−1) :给定投影操作的结果 R,逆投影生成部分列逆运算。结果是一个具有预期列(根据模式确定)的关系,但投影中未包含的列的值为 null。例如,若 R ← πA1,A2(S),则 π−1(R) = S∗,其中 S 和 S∗具有完全相同的列,S 和 S∗的属性 A1 和 A2 的值相同,S∗中其他属性的值为 null。当原始投影对关系的所有列进行操作时,可获得完全逆投影。
- 逆选择(σ−1) :逆选择生成部分元组逆运算,与逆投影类似,但它包含缺少的元组而非缺少数据的列。对于选择操作 R ← σp(A)(S) 的结果 R,逆选择为 σ−1p(A)(R) = S∗,其中 S∗ = R。当原始选择运算符的操作数中的所有元组都满足选择条件时,逆选择产生完全逆运算。
- 逆连接(⋊⋉−1) :逆连接类似于逆笛卡尔积,但生成的输出可能包含缺少的元组,具体取决于原始连接运算符中操作数的哪些元组满足指定条件。逆连接运算符的输出通过对预期输出的列进行投影来计算。一般来说,如果原始连接操作数中的所有元组都满足连接条件,或者连接类型是完全外连接,则可获得完全逆连接。如果连接类型是左外连接,则可以完全确定连接操作的右操作数,反之亦然。否则,生成部分元组逆运算。
- 逆交集(∩−1) :对于查询 T ← R ∩ S,逆交集生成包含 T 中所有元组的部分元组逆运算。当已知 R 和 S 相同时,可获得完全逆运算,此时三个关系 R、S 和 T 相等。
- 逆除法(/−1) :给定除法操作的商 Q 和余数 RM(Q ← R/S),逆除法生成两个关系 R∗和 S∗。关系 R∗ 很容易确定,因为 RM 中的所有元组也在 R∗ 中(RM ⊆ R∗)。只有当其中一个输出已知时,才能获得完全逆除法。如果 R 已知,则 S = R/T;如果 S 已知,则 R = (S × T) ∪ RM。
- 逆并集(∪−1) :对于并集操作 T ← R ∪ S 的逆运算,只有当其中一个输出已知时才能确定。即使如此,生成的输出可能是部分逆运算。如果关系 S 已知,则 R∗ = T − S;如果 R 已知,则 S∗ = T − R。只有当 R 和 S 没有共同元组时,才能获得完全逆并集。逆并集的特殊情况是 T 不包含元组,这意味着 R 和 S 也不包含元组。
- 逆差集(−−1) :对于差集操作 T ← R − S,逆差集运算符可直接确定操作的左操作数为 R∗ = T,因为 T ⊆ R。只有当关系 S 已知且 S 中的所有元组也在 R 中(即 S ⊆ R)时,才能确定完整的关系 R,此时 R = T ∪ S。如果 R 已知,也可以确定具有部分元组的关系 S∗,即 S∗ = R − T。如果 S ⊆ R,则可以从逆运算中找到完整的关系 S,即 S = R − T。

4. 数据库重建
4.1 动机

在取证调查中,常常需要发现或推断数据库在早期时间点包含的数据。虽然当前数据库中的数据可以通过查询数据库来确定,但取证调查中提出的查询答案往往不仅仅依赖于数据库的当前实例。因为自感兴趣的时间点以来,数据库内容可能因修改和更新而发生了变化。

例如,在欺诈调查中验证店员关于商品销售价格的说法,或者判断组织数据库中的某个关系被删除后,能否根据先前执行的查询证明客户记录曾在该关系中,又或者确定患者死亡是否是因为其记录中几周前的“处方药”列数据不符合预期等问题,都需要具备在早期时间点重建数据库值的能力。

4.2 重建示例

以下是一个 RA 日志示例,它由数据库的完整查询日志通过将查询转换为涉及关系代数运算符的操作生成,并分组为值块。

t1 : A ← ∅
t2 : B ← ∅
t3 : C ← ∅
t4 : A ← {At1, At2, At3, ... }
t5 : B ← {Bt1, Bt2, Bt3, ... }
t6 : C ← {Ct1, Ct2, Ct3, ... }
t7 : D ← σindex=1(πA1,A3,A4,A6(ForderDesc(σA5>10000(A))))
t8 : D ← σindex=1(πA1,A3,A4,A6(ForderAsce(σA5>100(A))))
t9 : G ← D ∪ E
t10 : D ← D ∪ πA1,A3,A4,A6(A)
t11 : H ← A ⋊⋉(A2=B1) B
t12 : B ← Fupdate(B3=NewValue)(ΣB1=Value(B))
t13 : I ← A ⋊⋉NJ B
t14 : J ← H ∩ I
t16 : H ← I − J
t17 : A ← ρA2=B1(A)
t18 : J ← ∅
VB2
VB1
VC1
VJ2
VB3
VI1
VA2
VD1
VH1
VJ1
VD2
VC2
VE1
VG1
VA1
VA3
VH2 t15 : H ← ∅
VH3

基于这个 RA 日志,在取证调查中可能会提出以下问题:
- 案例 1 :在时间 t8 时,关系 D 的 D1 列中是否存在特定值?
- 为了确定在时间 t8 时关系 D 的 D1 列中是否存在特定值,需要至少重建 t8 时 D1 列中的值并检查该值。根据日志,D 中的数据在 t7 和 t9 之间保持不变(值块 VD1)。因此,如果能在值块 VD1 中的任何位置确定 D1 中的数据,就可以检查所需的值。可以通过计算时间 t9 时关系 D 和 E 的并集的逆运算来实现,由于并集的第二个操作数(E)及其结果(G)自 t9 以来未改变,可计算部分或完全元组逆运算 D(取决于 D 和 E 是否有共同元组)为:
- ∪−1(G) = (D∗, E),其中 D∗ = G − E
- 另一种更简单的方法是执行在时间 t7 产生 D 的实际查询。这需要计算 t7 到当前时间之间改变关系 A 数据的操作的逆运算。由于 t7、t8、…、t16 的查询在 A 的同一值块(即 VA2)中,关系 A 仅在 t17 被修改。t17 的重命名操作(A ← ρA2=B1(A))的逆运算可通过将列 B1 的名称改回其先前名称 A2 来计算:
- ρ−1A2=B1(A) = ρB1=A2(A) = A
- 然后可以再次执行 t7 的查询以生成完整的关系 D。
- 由于 t7 在 VD1 中,另一种重建 D 中值的方法是计算值块 VD2 中第一个查询(即 D ← D ∪ πA1,A3,A4,A6(A))的逆运算:
- ∪−1(D) = (D∗, πA1,A3,A4,A6(A)),其中 D∗ = D − πA1,A3,A4,A6(A)
- 虽然关系 A 在 t17 被更新,但此更新不影响上述投影操作,因为重命名的列未被投影,因此不需要逆重命名操作。

需要注意的是,数据库中值的重建通常有多种方法,不同方法可能产生相同的输出,或者某些输出可能比其他输出更完整。在重建值的方法生成最少元组(或列)的情况下,应计算不同方法的并集以生成包含更多数据的关系。

  • 案例 2 :在时间 t13 时,关系 H 的 H2 列中存在某个值的说法是否正确?
    • 为了确定在时间 t13(值块 VH1 中)关系 H 的 H2 列中是否存在某个值,需要检查值块 VH1 和 VH2。显然,无法计算 VH2 第一行的逆运算,因为此时 H 中的所有数据都被删除了(t15)。从值块 VH1 来看,有两种方法可以重建关系 H 的 H2 列。t14 的交集操作的逆运算生成一个部分元组逆运算 H∗,其中包含关系 J 中的所有数据,但不幸的是,J 中的数据在 t18 被删除。因此,重建 H 中值的唯一可行方法是重新执行在 t11 产生 H 的查询(H ← A ⋊⋉(A2=B1) B)。为此,需要计算 t17 对 A 的重命名操作的逆运算和 t12 对 B 的更新操作的逆运算。也可以通过计算 t13 的自然连接操作的逆运算来确定关系 B。
    • t17 的重命名操作的逆运算根据前面的公式计算。为了使用 t12 的更新操作的逆运算来确定 B,需要将 B 中 B3 列的值替换为更新前的先前值。由于查询日志中不知道这些值,将 B3 列的值替换为 null。此外,由于更新操作首先从 B 中进行选择,更新操作逆运算的结果包含 B 的部分元组,B3 列中缺少值。因此,t12 查询的逆运算为:
      • F−1update(B3=NewValue)(σ−1B1=Value(B)) = Fupdate(B3=null)(B∗) = B∗
    • 也可以通过计算 t13 的自然连接操作的逆运算来获得具有部分元组的关系 B。由于关系 I 和 A 已知,关系 B 可以通过以下方式获得:
      • ⋊⋉−1NJ (I) = (A, B∗),其中 B∗ = πB1,B2,…,Bn(I)
    • 如前所述,可以计算从上述两个公式生成的两个关系的并集,以生成更完整的 B∗。例如,公式 5 生成的 B∗ 中 B3 列的 null 值的实际值可能可以从公式 6 生成的 B∗ 中确定。最后,由于关系 A 和 B(具有部分元组且可能包含一些 null 值)都可以确定,可以再次执行 t11 的查询(H ← A ⋊⋉(A2=B1) B)以获得 H∗,H∗ 很可能也包含部分元组。然后可以通过检查 H2 中的数据来确定 H2 包含特定值的说法是否正确。

在重建后,感兴趣的值可能包含在 H 中缺失的元组中。在取证调查中,可以通过在预期包含该值的其他关系中重建该值来加强关于该值在关系中存在或不存在的结论。如果在任何其他预期包含该值的关系中都无法重建该值,那么该值很可能不在感兴趣的关系(H)中。

综上所述,利用逆关系代数运算符、RA 日志和值块进行数据库重建为数字取证调查提供了一种有效的方法,可以帮助解决许多实际问题。

4.3 数据库重建算法

基于上述的理论和示例,我们可以总结出数据库重建的一般算法流程,具体步骤如下:
1. 日志转换 :将数据库的完整查询日志转换为关系代数日志(RA 日志),这一步骤需要将 SQL 查询语句转化为关系代数运算符的操作序列。
2. 值块分组 :根据关系的赋值和重命名操作,将 RA 日志分组为值块,每个值块内特定关系保持不变。
3. 确定查询目标 :明确在取证调查中需要查询的关系和时间点,例如案例 1 中查询关系 D 在时间 t8 时 D1 列的值,案例 2 中查询关系 H 在时间 t13 时 H2 列的值。
4. 查找值块 :根据时间点和关系,在 RA 日志中找到对应的价值块,确定该时间点所在的值块范围。
5. 逆运算计算 :根据值块内的操作,计算相应的逆关系代数运算符,逐步还原关系在目标时间点的状态。
6. 结果验证 :检查重建后的值是否满足查询需求,如是否包含特定的值。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A(开始):::process --> B(查询日志):::process
    B --> C(转换为RA日志):::process
    C --> D(分组为值块):::process
    D --> E(确定查询目标):::process
    E --> F(查找值块):::process
    F --> G(逆运算计算):::process
    G --> H(结果验证):::process
    H --> I(结束):::process
5. 总结与展望
5.1 总结

本文介绍了一种用于数据库取证的重建算法,通过逆关系代数运算符、关系代数日志(RA 日志)和值块的组合,能够在一定程度上还原数据库在早期时间点的状态。具体内容包括:
- 关系数据库模型 :回顾了关系数据库模型的基本概念,包括关系、基本运算符等,为后续的逆关系代数和数据库重建奠定了基础。
- 逆关系代数 :定义了关系代数的逆运算符,分为完全逆运算符和部分逆运算符,并详细阐述了它们的计算方法和适用条件。
- 数据库重建 :通过实际的 RA 日志示例,展示了如何利用逆关系代数和值块进行数据库重建,解决了取证调查中常见的问题。

关键概念 描述
关系数据库模型 基于集合论和关系存储和操作数据,包含基本运算符如笛卡尔积、并集、交集等
逆关系代数 包括完全逆运算符(逆重命名、逆笛卡尔积)和部分逆运算符(逆投影、逆选择等)
数据库重建 利用 RA 日志和值块,通过逆运算还原数据库在早期时间点的状态
5.2 展望

虽然本文提出的数据库重建方法在一定程度上解决了取证调查中的问题,但仍存在一些可以改进和拓展的方向:
- 处理复杂操作 :当前的方法主要针对基本的关系代数操作,对于更复杂的数据库操作,如嵌套查询、函数调用等,还需要进一步研究如何进行逆运算和重建。
- 提高重建准确性 :部分逆运算符可能无法得到完全准确的结果,未来可以探索如何结合更多的信息,如数据库的备份、事务日志等,提高重建的准确性。
- 自动化工具开发 :开发自动化的数据库重建工具,将上述算法集成到工具中,提高取证调查的效率和准确性。

总之,数据库取证中的重建技术是一个具有挑战性和潜力的研究领域,未来的研究将有助于更好地应对数字取证中的各种问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值