27个版本 (稳定版)
6.0.0 | 2023年12月8日 |
---|---|
5.0.3 | 2023年9月18日 |
5.0.0 | 2023年8月3日 |
4.0.3 | 2023年7月11日 |
0.7.2 | 2022年10月15日 |
#157 in 加密学
5,347 每月下载量
用于 2 个crate(通过 cloudproof_findex)
2.5MB
3K SLoC
Findex
Findex旨在解决以下问题
如何安全地恢复与给定关键字匹配的加密数据的位置?
这是一个设计用于在不受信任的云服务器上安全执行搜索查询的加密协议。由于其加密索引,大型数据库可以在不损害可用性的情况下安全地外包。
Findex是Cosmian Cloudproof加密的一部分。
入门
Findex允许通过关键字进行值索引。这些值可以是位置(加密数据库的UID、URL、路径等)。
使用Findex API,可以通过以下方式
- 通过
FindexUpsert
特质按关键字索引或取消索引值; - 通过
FindexSearch
特质搜索关键字; - 通过
FindexCompact
特质压缩索引。
这些特质可以自动实现,并提供一个宏来帮助语法。默认参数(宏使用的参数)在parameters.rs
中定义。
Findex将回调的实现委托给用户以操作索引。这使得Findex与任何数据库技术兼容,因为它不包含任何特定于数据库的代码。实现是通过
请参阅in_memory_example.rs
以获取实现的示例。
构建和测试
要构建Findex,只需运行
cargo build --release
要测试,运行
cargo test --release --all-features
要启动基准测试,运行
cargo bench --all-features
Findex索引
Findex依赖于两个服务器端索引
- 条目表:提供从链表表获取正确位置所需的数据。每个索引关键字匹配条目表中的一行。
- 链表:安全存储索引值。这些索引值可以是位置或其他关键字的指针。位置通常是数据库UID,但Findex可以用于索引任何类型的位置(URL、路径等)。为了使行不可区分,可变长度的索引值以固定长度的块存储,并且每行存储相同数量的块(必要时添加填充)。
Findex索引是键值存储,其结构如下表所示,其中$K_{w_i}$是与关键字$w_i$相关联的临时密钥,$H_{w_i}$是$w_i$的哈希值,$UID_{last}$是与$w_i$关联的索引值链的最后一个UID。
条目表 | |||
---|---|---|---|
键 | 值 | ||
UID | $K_{w_i}$ | $H_{w_i}$ | $UID_{last}$ |
链表 | |||
---|---|---|---|
键 | 值 | ||
UID | $\textnormal{block}_1$ | ... | $\textnormal{block}_B$ |
链表值的序列化如下(大小以字节为单位)
标志 | 块1 | ... | 块B | |||
---|---|---|---|---|---|---|
前缀 | 数据 | ... | 前缀 | 数据 | ||
大小(字节) | 1 | 1 | 16 | ... | 1 | 16 |
存储时,索引值使用AEAD进行对称加密。我们的实现使用16字节MAC标签和12字节nonce。
标志用于标记块为添加或删除。每个位对应一个块,这限制了单个链表值内部可能包含的块数最多为8。前缀用于写入块内部存储的数据的实际长度。
因此
- 给定$N$为使用的关键字数量,条目表的大小由以下公式给出(以字节为单位)
L_{entry~table} = (L_{uid} + C_e + L_{K_{w_i}} + L_{H_{w_i}} + L_{uid}) \cdot N
= 140 \cdot N
- 给定$V(w_i)$为关键字$w_i$的体积(即由该关键字索引的值数)链表的大小由以下公式给出(以字节为单位)
L_{chain~table} = \left(L_{uid} + C_e + 1 + B * (1 + L_{block})\right) \sum\limits_{i~\in~[1,N]}\left\lceil \frac{V(w_i)}{B}\right\rceil
= 146 \sum\limits_{i~\in~[1;N]}\left\lceil \frac{V(w_i)}{5}\right\rceil
其中
- UID的长度:$L_{uid} = 32~\textnormal{bytes}$
- 临时密钥的长度:$K_{w_i} = 16~\textnormal{bytes}$
- 关键字哈希的长度:$H_{w_i} = 32~\textnormal{bytes}$
- 链表宽度:$B = 5$
- 块长度:$L_{block} = 16~\textnormal{bytes}$
- 加密开销:$C_e = 28~\textnormal{bytes}$
两种索引策略
天真(对所有可能的切片进行索引位置)
mar
-> {位置}mart
-> {位置}marti
-> {位置}martin
-> {位置}martine
-> {位置}
混合
mar
->martine
mart
->martine
marti
->martine
martin
->martine
martine
-> {位置}
图
mar
->mart
mart
->marti
marti
->martin
martin
->martine
martine
-> {位置}
对于图解决方案,需要更多的客户端/服务器交互:与天真解决方案的1相比,本例中的图深度为4,与混合解决方案的2相比。
另一方面,图解决方案优化了链表的大小。
平均位置 | #记录 | 大小(KB) | 比率 | |||||
---|---|---|---|---|---|---|---|---|
天真 | 混合 | 图 | 天真 | 混合 | 图 | 混合/天真 | 图/天真 | |
1 | 49016 | 53058 | 49316 | 6988 | 7564 | 7031 | 1.08 | 1.01 |
2 | 58253 | 57347 | 53526 | 8305 | 8176 | 7631 | 0.98 | 0.92 |
3 | 71455 | 61817 | 57949 | 10187 | 8813 | 8262 | 0.87 | 0.81 |
4 | 80692 | 66671 | 62785 | 11504 | 9505 | 8951 | 0.83 | 0.78 |
5 | 86048 | 72676 | 69014 | 12268 | 10362 | 9839 | 0.84 | 0.80 |
基准测试
本节中展示的基准测试是在Intel(R) Xeon(R) Platinum 8171M CPU @ 2.60GHz上运行的。
文档
Findex支持的论文可以在Findex 白皮书中找到。
开发文档可在doc.rs上找到。
依赖项
~2.3–3MB
~62K SLoC