参考文章:
ORAM简介_c630843901
oblivious RAM
什么是oblivious RAM?
参考论文:
不经意随机访问机研究综述. 吴鹏飞, 沈晴霓, 秦嘉,等. (北京大学)软件学报(核心期刊)2018
例子:比如一个医院把数据存到了AWS,然后AWS的管理员看不见数据的内容,但是他能看见每次都是那些数据被修改了。然后他去了这个医院看了很多次病,发现每次都是同一个位置的数据被修改了,他就知道这个位置存放的数据是他的。但是用了Oblivious RAM,就看不出来了。
访问模式:这里的访问模式是指程序对存储器的一系列访问所泄露的信息,包括命令(读或写)、地址和数据。
上个世纪80年代,为了隐藏程序对内存的访问模式(处理器访问内存的操作序列和地址序列)来避免软件的逆向工程,Goldriche 等人在此基础上提出了 ORAM。
由于云计算的迅猛发展,越来越多的企业和个人把数据外包到位于公有云上,然后数据安全和隐私保护就显得越来越重要。
在云存储中,用户以密文形式将数据存储于云服务器上。但是,当用户需要查询某一个数据块的内容,在执行查询请求的过程中, 数据块的索引并不能加密, 这就泄露了用户访问数据库元素的位置。这使得攻击者可以通过用户的访问模式(access pattern)来推断存储数据的重要性, 例如统计每一个数据块的访问频率; 同时, 攻击者还可以通过匹配前后两个连续的访问模式来推断数据查询之间的关联关系, 甚至是加密数据的内容。
在实际场景中, 这些信息潜在性地暴露了用户的行为特征、兴趣爱好、社交范围等, 例如, 一个人查询某一类药物, 可以推断他患有什么疾病。另一方面, 在安全计算领域, 当用户将隐私数据和任务以加密方式存储在内存中, 如果暴露了处理器对内存的访问模式, 就可能泄露数据和任务本身的信息。
因此, 在大数据与云计算等应用场景中, 仅通过对数据本身的内容加密并不能完全的保护用户的隐私。对用户的访问模式的保护, 也是目前重点的研究目标。
低效、安全、用途广
不经意随机访问机是一种重要的保护访问模式的手段,它通过混淆每一次访问过程,使其与随机访问不可区分,从而保护真实访问中的访问操作、访问位置等信息.不经意随机访问机在安全云存储系统以及安全计算领域有着非常重要的作用。利用不经意随机访问机可以降低攻击者通过访问模式推测隐私信息的可能性,减小系统受到的攻击面,从而提供更安全更完整的服务。
一个IO操作序列被定义为如下形式:((op1, arg1), (op2, arg2), …, (opn, argn)),其中opi(i=1,2…n)表示读、写操作,argi为访问文件的地址和一个数据值,x和y是两个长度相同的IO操作序列,即|x| = |y|,A(x)和A(y)分别对应x和y在第三方存储上的操作序列,对于除了用户自己外的任何人,这两个操作都是计算上难以区分的,就说这个ORAM方案是茫然的(oblivious)。
ORAM保证以下信息不会被泄露:
ORAM协议用途非常广泛,可以应用在保护访问模式的诸多应用中,如可搜索加密,还有外包的安全云存储,安全处理器的构造,安全多方计算,动态的数据审计协议等场景中。
简单模型:服务器以数组的方式连续存储客户端的数据块.为了隐藏客户端访问了哪一个数据块, 客户端每一次访问需要遍历所有数据块.对于不需要的数据块, 客户端读取之后再写回相同的数据块; 对于目标数据块, 客户端读取后在本地更新, 再写回更新后的数据块.同时, 即使客户端找到目标数据块, 依然继续访问。
平方根模型:将服务器划分成两部分:排列数组(permuted array)与缓冲区(shelter).排列数组中包含N个真实数据块(real block)和√N个无效数据块(dummy block).客户端每次访问之前需要将排列数组中的所有的数据块混洗.在每一次访问中, 客户端先查找目标数据块是否在缓冲区中:如果在缓冲区中, 就从排列数组中读取一个无效数据块; 如果没有在缓冲区中, 就从排列数组中读取目标数据块.为了混淆数据块的访问位置, 每一个访问周期(√N次访问)需要重新混洗排列数组。
下面的模型暂未理解
层次模型:将服务器的存储划分为层, 第i层包含2i个数据块集合(bucket), 对于每一层而言, 当一个访问周期(2i次访问)结束后, 需要将当前层的数据块和下一层的数据块合并并且混洗后放入下一层.每一层实际上都是一个hash表, 并且包含一个hash函数.每一层的访问周期结束后, 需要更换hash函数.当客户端访问一个数据块时, 从最顶层到最底层依次查找, 通过计算hash函数来判断目标数据块是否在当前层:如果在, 则根据hash函数计算所得的偏移量获得对应数据块; 如果不在, 则继续查找下一层.与简单模型类似, 为了保护访问模式的隐私, 即使找到了目标数据块也会继续查找下一层, 之后, 每一层会随机访问一个无效数据块, 直到所有层都被访问.当客户端更新完数据块后, 将其写入服务器最顶层.由于顶层的访问周期短, 其中的数据块会频繁地混洗到下一层, 因此不用担心顶层数据块溢出的问题。
分区模型:将数据存储在√N个服务器(partitions)中, 每一个服务器利用平方根模型或者层次模型构建, 同时, 客户端存储数据块索引到数据块在服务器位置之间的映射表以及每一个服务器的缓存(cache slots).对于客户端每一次访问, 先根据映射表查找数据块所在的服务器, 然后使用对应ORAM模型的访问方式获取数据块.当获得数据块之后, 将其重新分配一个新的服务器, 并写入对应服务器的缓存中.缓存满之前执行将数据写回对应的服务器。
树状模型:在层次模型上进行改进, 将每一个数据块集合分配到树的节点上, 客户端本地存储每一个数据对应树的叶子节点的映射关系(position map).以Tree ORAM为例, 每一次访问先查询数据块所在的叶子节点, 将从根节点至这个叶子节点上所有的数据块集合取回本地.更新完之后, 将目标数据块写入根节点.每一次访问结束之后, 在每一层随机选择v个数据块集合执行驱逐操作, 将一个真实数据块写入它对应叶子节点那条路径上的子节点数据块集合中.同时, 再选出一个无效数据块写入它另一个子节点的数据块集合中。