
简介针对传统云存储高成本、依赖可信第三方等问题这份PDF提供了基于区块链技术的数据存储系统完整设计方案。内容涵盖去中心化云存储架构、加密算法与私有关键字搜索机制并详细阐述了系统匿名性、低成本、去中心化、可用性与安全性等特点适合区块链、云存储及密码学方向的研究生、工程师和教师作为技术分析与参考文献使用。资源为1个PDF文件大小约1.11MB包含论文正式排版内容并附有中英文摘要、基金项目及引用信息。已有271人学习浏览。通过该文档读者可系统掌握区块链用于数据存储的核心思路与实现方法包括数据加密上传、授权搜索、共识机制权衡以及与传统云存储的对比分析可作为课程设计、毕业设计或科研开题的参考资料。1. 区块链数据存储系统可搜索加密与去中心化存储的交接点传统云存储把数据集中到少数服务商手里成本高且要先信任对方数据一上传可用性和隐私基本都押在服务商的运维水平上。2019年重庆理工大学学报上的这篇设计论文给出一个更具体的解法用许可区块链作为底层支撑数据所有者加密后把密文分片交给联合云加密关键字标签写进区块链DHT负责索引定位。数据消费者不必下载整个数据集而是用陷门在密文标签上做私有搜索搜索时区块链节点验证的是凭证是否有授权而不是用户是谁。这套设计把“去中心化”从记账层推进到存储层对做分布式系统、密码学应用以及想从0搭建一个区块链平台的人来说都是值得拆解的样本它明确了链上只放可验证的引用和凭证数据本体继续留在链下。2. 许可区块链存储架构拆解数据所有者、消费者与联合云节点的职责边界2.1 三个角色与一条核心链路数据所有者、数据消费者、区块链节点是论文设定的三方。数据所有者负责构造文档集每个文档挂一组固定关键字上传前先在客户端加密。加密数据集由云联盟分布式存储加密关键字标签交给区块链维护。数据消费者不是所有者的同组人而是订阅者所有者授权后消费者向区块链节点证明自己持有合法凭证然后执行关键字搜索。这条链路的关键在于授权和搜索是可分离的。凭证证明用零知识方式完成区块链节点只确认“你有权限”不关心“你是谁”。这也直接回答了为什么要把存储系统拆成链上和链下两层链上放授权、标签、审计记录的根链下放密文分片这样既保留去中心化的信任模型又绕开区块链不适合存大文件的天然限制。2.2 DHT与区块链各存什么区块链不存储数据本身只存对数据的引用。DHT分布式哈希表则用于协调和维护对等系统中关于密文分片的元数据。论文把这两层分得很清楚整理如下存储层级保存内容写入方读取方区块链加密关键字标签、凭证承诺、可检索性证明记录数据所有者、审计节点授权数据消费者、全部节点DHT密文分片索引、访问密钥引用数据所有者授权数据消费者联合云节点加密文档分片数据所有者授权数据消费者为什么把引用和数据分开区块链本身不适合存大文件块大小和同步成本都不允许DHT 在 P2P 系统里已经很成熟负责维护“哪些分片在哪个节点”的元数据。论文里的做法是区块链存储对数据的引用比如文件哈希H(F)和一组 EKS 密文检索到之后消费者再去 DHT 拿实际分片位置。这一层分离直接决定了后续搜索流程DHT 不参与授权授权逻辑全部收敛在区块链的访问控制层。若把 DHT 的元数据也上链每次文件分片迁移都会产生一笔额外的链上写入在分片频繁复制时会很快放大存储成本。2.3 可检索性证明的挑战-响应联合云节点可能节省存储私藏部分分片不存所以系统引入可检索性证明。论文里把文件 F 分成 n 个段F {F1, F2, ..., Fn}节点 P 需要证明它确实持有这些段。基本方案是挑战-响应审计方发随机挑战集合 RP 返回被挑战段和 Merkle 伴随路径审计方用根摘要验证。下面是这个流程的逻辑模拟。# por_sim.py —— 可检索性证明的挑战-响应逻辑模拟 import hashlib def setup(file_segments): # Setup(F) - digest叶子是文件段根是摘要 nodes [hashlib.sha256(seg).digest() for seg in file_segments] while len(nodes) 1: nodes [hashlib.sha256(nodes[i] nodes[i 1]).digest() for i in range(0, len(nodes), 2)] return nodes[0] def prove(file_segments, challenge_indices): # Prove(R - F_ri, pi_i)按挑战下标返回数据块和Merkle伴随路径 proof [] for idx in challenge_indices: block file_segments[idx] path build_merkle_path(file_segments, idx) proof.append((block, path)) return proof def verify(digest, challenge_indices, proof): # Verify(digest, R, F_ri, pi_i)用路径和块重建根摘要 if len(challenge_indices) ! len(proof): return False for idx, (block, path) in zip(challenge_indices, proof): if not check_path(digest, idx, block, path): return False return True逻辑说明setup对应论文里的Setup(F) - digest把文件分片作为叶子构造成 Merkle 树根节点就是被公开的摘要。prove对应Prove(R - F_ri, pi_i)每次收到随机挑战集合只取被抽中的段和对应伴随路径不需要返回整个文件。verify对应Verify(digest, R, F_ri, pi_i)逐条重建并比对路径只要有一条不一致就判定失败。参数含义file_segments是文件分片列表 Fchallenge_indices是随机挑中的段下标 Rdigest是 Setup 产出的 Merkle 根。build_merkle_path和check_path在实现时直接调用成熟 Merkle 树库即可不必自己重写。论文要求随机预言机模型生成挑战并定期调度负责挑战的区块链节点把证明记录到链上其他节点可以验证。这里的关键是“挑战不可预测”如果节点预先知道下轮会被查哪几个段它可以只保存这些段所以挑战必须由随机源产生。2.4 这一层最容易踩的坑第一个坑是混淆可检索性证明与副本证明。POR 证明“文件能取回”不等于节点保留了多少份副本也不覆盖“数据没有被删改”的所有场景。第二个坑是挑战频率论文里用修正间隔调度随机挑战实际部署时若间隔过短审计流量会占满内网带宽若间隔过长节点恶意删数据后可以靠时间差补回。第三个坑是不要把 Merkle 根提交到链上后就不再管叶子分片更新时根会变需要有版本化机制否则旧摘要和新分片对不上。这几个问题论文没有展开属于实现层必须补的细节。3. 私有关键字搜索落地EKS加密方案与陷门匹配的代码推演3.1 五步算法与参数含义私有关键字搜索部分论文用 EKS 可搜索加密方案五个算法串起从密钥生成到匹配的全部过程。整理如下算法输入输出职责KeyGen安全参数主密钥 k生成密码系统密钥KeyDerivek, 用户秘密 s搜索令牌 ks为数据消费者派生私有搜索关键字Trapdoor关键字 w, ks陷门 Tw生成不可逆向的搜索陷门Encrypt关键字 w, k密文 c(r,h)为索引关键字生成可测密文TestTw, c0 或 1判断陷门与密文是否对应同一关键字说明一下记号G1、G2 是素数阶 p 的乘法循环群GT G1 × G2g1、g2、gT 分别是对应生成元。KeyGen 取随机k - Z_pKeyDerive 计算ks g2^(k*s)Trapdoor 输出Tw e(H(w)^s, ks)这里 H 把字符串映射到 G1Encrypt 对关键字 W 计算密文Test 验证等式。H2 是GT × GT - {0,1}的哈希函数实际作用是把配对运算结果压缩成固定长度比特串。3.2 用HMAC模拟EKS的加密与测试真实实现要引入双线性对运算开发阶段不好调。常见做法是先用一个对称版本的模拟把流程跑通验证“加密-陷门-测试”三者关系之后再换双线性对库。下面代码用 HMAC-SHA256 模拟配对结果函数接口与论文算法一一对应。# eks_sim.py —— 模拟EKS五个算法的简化实现 import hmac import hashlib import os def keygen(): # KeyGen: 返回主密钥k return os.urandom(16) def key_derive(k, user_secret): # KeyDerive(k, s): 用主密钥和用户秘密派生搜索令牌ks return hmac.new(k, user_secret.encode(), hashlib.sha256).digest() def encrypt(keyword, k): # Encrypt: 为关键字W生成EKS密文c(r,h) r os.urandom(16) h hmac.new(k, r keyword.encode(), hashlib.sha256).digest() return (r, h) def trapdoor(keyword, ks): # Trapdoor: 生成陷门Tw节点无法从Tw反推keyword return hmac.new(ks, keyword.encode(), hashlib.sha256).digest() def test(tw, cipher): # Test: 检查H2(r, tk)是否等于密文中的h r, h cipher tk tw return hmac.new(tk, r, hashlib.sha256).digest() h # 数据所有者加密索引关键字 master_key keygen() cipher encrypt(invoice, master_key) # 数据消费者从所有者拿到派生令牌后检索 ks key_derive(master_key, user-007) tw trapdoor(invoice, ks) print(test(tw, cipher)) # 输出True说明匹配成功逻辑说明keygen()对应 KeyGen输出 16 字节随机字节串作为主密钥 kkey_derive(k, user_secret)对应 KeyDerive把所有者主密钥与消费者秘密加盐派生出一个专属于该消费者的搜索令牌ks这一步是“私有”的来源encrypt(keyword, k)对应 Encrypt生成(r, h)元组密文r 是每次加密都不同的随机数trapdoor(keyword, ks)对应 Trapdoor把关键字和 ks 绑成陷门test(tw, cipher)对应 Test只比对 H2 结果不还原关键字。最后一个用例演示完整流程所有者用master_key加密关键字授权消费者用派生令牌生成陷门测试结果为 True。这个模拟省掉了双线性对参数含义一一对应论文第 2.3 节的五个协议。真正生产代码里用petlib或pyUmbral这类密码学库替换 HMAC 部分替换时保持函数接口不变即可。提示HMAC 版本的 EKS 只能用于流程演示不能用于生产环境。双线性对上的可搜索加密方案里Encrypt 和 Test 的随机数、幂运算顺序都由安全证明定义私自替换成纯哈希会把数学安全性丢掉。3.3 私有搜索与公钥可搜索搜索的区别论文标题里“私有”两个字不是修饰。传统 PEKS 公钥可搜索加密允许任何持公钥的人为任意关键字生成陷门这套系统的 KeyDerive 需要数据所有者把用户秘密 s 映射进搜索令牌ks没有ks就无法构造合法 Tw因此授权粒度被收紧到单个消费者。节点能做的只有 Test把 trapdoor 和所有 EKS 密文逐个比对如果输出 1 就把对应的H(F)返回给消费者。由于 H 的哈希特性节点即使看到大量 Tw也无法恢复关键字。这里要注意陷门是确定性生成的同一个关键字和同一个 ks 会生成相同 Tw节点可以观察两个不同请求的 Tw 是否相等并推断它们是否在搜同一个词。论文没有进一步混淆这一步真实产品里要在消费者端加随机化或代理层做缓存否则匿名性会在这条侧信道里打折扣。4. 匿名凭证验证与性能对比承诺、零知识证明与搜索时间4.1 匿名凭证的四步算法访问控制部分由四个算法组成Setup1(lambda) - par、GenCred(s, par) - (c, skc)、ShowCred(par, S, c, skc, Sc) - pi_S、VerifyCred(par, pi, Sc) - 1/0。数据所有者为消费者 B 生成假名 S用数字承诺方案提交承诺C g^S h^r承诺打开随机数只有 B 知道这样 B 才能在未来构造零知识证明表明自己知道 C 的打开方式和公开值 r。公告板实际就是许可区块链上面积累一组承诺集合Sc {C1, C2, ..., Cn}。ShowCred 不直接出示 c而是生成一个非交互式证明验证者用累加器检查 c 是否属于 Sc但不知道具体是哪一个。累加器的计算也要看得懂给定承诺集合Accumulate(par, Sc)输出A u^(c1*c2*...*cn) mod N其中 N 是两个大素数乘积u 是生成元。要为一个凭证 c 生成见证就用GenWitness(par, c, Sc)对集合中除 c 以外的所有素数求累加得到w Accumulate(Sc - {c})。验证时只需检查w^c mod N A。这种设计的价值在于证明体积不随订阅者数量增长节点不需要遍历整张用户表。4.2 三种云存储系统的性能对比论文将本系统与两种现有方案做了对比文献[13]是云存储加密数据的隐私保护全文检索系统文献[14]是混合策略的低成本云存储方案。整理后如下。方案安全性隐私性依赖可信第三方低成本匿名性文献[13]全文检索隐私保护支持支持依赖不支持不支持文献[14]混合策略低成本存储支持支持依赖不支持不支持基于区块链的数据存储系统支持支持不依赖支持支持从表里能看出前两种方案在安全性和隐私性上并不差差距集中在“依赖可信第三方”这一列。原设计把授权、搜索令牌生成、完整性审计全部搬到链上联合云节点之间互相牵制任何单一节点都不能独自通过审计这就是它把对第三方信任降到最低的原因。低成本在这里指的不是存储单价更便宜而是省略了数据所有者自己检索整个数据集再过滤的开销客户端不需要下载完整密文集做匹配。4.3 搜索时间为什么反而更短论文在 Linux 平台、i7 处理器、8G 内存的笔记本上测了三种系统在不同数据存储量下的搜索时间结果都是随数据量上升但基于区块链的系统增长更平滑。原因在于它把离线存储访问、许可授权和搜索令牌生成做成一条主干消费者拿到授权后直接对密文标签测陷门命中的才去 DHT 取分片全文检索方案需要在客户端本地完成更多过滤逻辑混合策略存储方案要维护额外的中心调度。需要提醒的是实验规模有限不能直接外推到公链或 TB 级文件场景许可链的吞吐、区块确认延迟仍会限制搜索请求并发测试数据只说明架构方向有效不代表任何未发布的性能承诺。5. 从论文到原型把DHT、智能合约和EKS串起来的最小实验技巧5.1 用hash链模拟区块链中的EKS标签搭建最小原型的常见做法是先不管共识和网络只验证数据链路。论文第 2.3 节中存储在区块链里的结构是(H(F), EKS(W1), ..., EKS(Wn))即文件哈希加一组关键字密文。下面代码把每个块的数据体简化成文件哈希加一个 EKS 密文用 hash 指针串成链。# minimal_blockchain.py import hashlib prev_hash b0 * 32 for index in range(5): file_hash hashlib.sha256(ffile-{index}.encode()).digest() eks_label hashlib.sha256(feks-{index}.encode()).digest() block_hash hashlib.sha256(prev_hash file_hash eks_label).digest() print(fblock {index}: {block_hash.hex()[:16]}) prev_hash block_hash逻辑说明prev_hash存放前一个区块的哈希循环里把它与当前区块的文件哈希、EKS 标签拼在一起计算新的区块哈希。任何一节的eks_label被改动后续所有区块哈希都会不匹配这就是论文中“块通过哈希指针顺序连接”的最小可验证版本。参数说明file_hash对应H(F)eks_label在这里用占位哈希模拟 EKS 密文真实系统里把第 3 节encrypt()的返回值序列化后放进来即可。5.2 两个验证细节第一个细节审计时一定要把 Merkle 路径节点也存进 DHT。POR 验证需要叶子块和路径一起提交只有根摘要而没有路径verify是无从下手的。第二个细节EKS 密文入库前要测试一下“错误关键字不匹配”。调用test(trapdoor(invoice, ks), encrypt(report, k))如果返回 True说明生成陷门的派生态和加密用的主密钥不在同一条链路上通常出在key_derive的拼接顺序上。把这两点排掉再把第 2 节的 POR 模拟和第 3 节的 EKS 模拟组合起来就能复现一个从上传、审计到检索的完整演示闭环。本文还有配套的精品资源点击获取