更新时间:2026-03-04 GMT+08:00
分享

ProofCode生成步骤

端侧和服务端使用相同的文件片段计算摘要,当两边计算的摘要值相同,则表示用户拥有文件,避免出现通过文件sha256撞库其他用户文件。例外情况,当文件大小为0时,不需要计算该值。

步骤1:生成存储证明种子(ProofSeed)

ProofSeed = HexEncode(SHA256(originValue))
  • originValue:当使用appid的方案认证鉴权时,从请求头X-User-Id取值,其他认证鉴权方案从请求头Authorization取值。
  • SHA256(String):对于任意长度的消息,SHA256都会产生一个256位的哈希值,称作消息摘要。
  • HexEncode(ByteArray):表示以小写字母形式返回摘要的Base-16编码的函数。输入的每一个字节都表示为两个十六进制字符。

步骤2:确定参与计算存储证明的文件二进制片段

计算出参与计算的文件二进制的开始(start)和结束位置(end)。

Start = LongValueUnsigned(ByteSub(SHA256(ProofSeed),24,32))%size;
End = Start+8>=Size?Size:Start+8;
  • SHA256(String)对于任意长度的消息,SHA256都会产生一个256位的哈希值,称作消息摘要。
  • ByteSub(ByteArray,Integer,Integer)表示从摘要值截取区间指定区间的Byte。该场景SHA256会返回32Byte,取摘要值的后8Byte,即[24,32)区间对应的Byte。
  • LongValueUnsigned (BitSet)表示将字节数组转换成8字节的整形值。该函数在实现时必须去掉第一个byte的符号位,保证返回一个正整数。
  • size表示文件的大小(单位Byte)。
  • 参与计算存储证明的文件二进制片段即[Start,End)区间对应的文件二进制的片段。

步骤3:计算存储证明

根据二进制片段,从文件的二进制数据的对应位置取出对应的数组。

Data = readFile(file, start, end);
proofCode = HexEncode(SHA256(Data))
  • readFile(File,Integer,Integer):表示从文件的指定范围读取字节数组。
  • SHA256(ByteArray) :对于任意长度的消息,SHA256都会产生一个256位的哈希值,称作消息摘要。
  • HexEncode(ByteArray):表示以小写字母形式返回摘要的Base-16编码的函数。输入的每一个字节都表示为两个十六进制字符。

相关文档