我们提出了一种新的NOTE协议,用于在分布式点对点互联网中保护隐私数据。该协议使用底层区块链将数据存储在有向图结构中。该协议利用BIP32标准确定私钥的生成规则,使用Electrum BIE1 ECIES算法对数据进行加密,指定了数据的存储格式,并实现了数据的增删改查和分享规则。
根据NOTE协议,您的信息安全不需要信任任何第三方。数据安全和存储安全得以实现,只有助记词持有人可以访问数据。数据不会保存在特定的第三方服务器或云服务上。
这是一个第二层解决方案,它建立在不可更改的Bitcoin协议和底层区块链的共识规则之上。
该协议支持同一个助记词账号的数据高并发上链,每一条记录使用无法预测的随机公私钥进行加密解密,支持多用户之间的加密数据分享等特性。
BIP32定义了一套通过助记词派生私钥的算法。通过私钥可以获取对应的公钥和公钥哈希(即地址)。
Electrum BIE1 ECIES定义了如何使用椭圆曲线算法加密和解密数据。
Bitcom协议定义了每个账号的命名空间。
私钥派生路径定义如下:
m/purpose'/coin_type'/account'/target/quotient/remainder
其中
purpose = 44
coin_type=236
account=0
target=2
随机生成一个64位数字作为派生索引,计算商和余数。索引需符合IEEE754标准,值应在1和2^53-1之间。
const Hardened = 0x80000000
const quotient = Math.floor(index / Hardened)
const remainder = index % Hardened
完整的派生路径为:
const extPath = `m/44'/236'/0'/2/${quotient}/${remainder}`
根私钥基于以下路径派生
const extPath = `m/44'/236'/0'`
数据存储在OP_RETURN后面,分为四个部分:
OP_FALSE OP_RETURN 根地址 派生索引 加密数据 签名
其中
- 根地址:根私钥生成
- 派生索引:随机生成的64Bit数字
- 加密数据:使用派生索引创建的密钥对,使用其中的公钥加密数据
- 签名:使用根私钥对加密后的数据进行签名
签名使用根私钥对加密数据的SHA256哈希进行签名。根地址公钥可以公开,任何人都可以用根地址公钥校验数据是否被伪造,以达到确权的目的。
sign(sha256( encrypedNote ))
用户数据可以使用任意格式。数据经过使用Electrum BIE1 ECIES加密算法进行加密。
以下JSON格式定义属于NoteSV,这是一个密码管理软件。其他使用NOTE协议的软件可以自行定义:
{
id:
tpl:
ttl:
mem:
fid:
pwd:
url:
otp:
ptx:
tags: []
files:[],
tms
}
其中
- id: 数据的主键
- tpl: 内容模版
- ttl: 标题
- mem: 正文
- fid: 用户名
- pwd: 用户密码
- url: 网站链接
- otp: 一次性密码key
- tags: 内容标签
- files: 文件数组
- del: 删除标志
- ptx: 父内容的交易id
- tms: Unix时间戳
数据创建时的id使用当前UNIX时间戳外加随机数的形式。这样做可以按照时间顺序排列id,并且可以避免多个同账号APP并发存储数据时产生冲突。
数据更新时不改变数据id,只改变其他字段。
数据删除时不改变数据id,只是将del字段设置为true。
数据存储中的根地址输入Bitcom协议,使用支持Bitcom协议的比特币数据服务商,可以检索到所有交易记录。
数据分享之前,需要获取对方的根公钥。存储格式为:
OP_FALSE OP_RETURN 根地址 派生索引 加密数据 签名
其中
- 根地址:通过对方根公钥获取对方的根地址
- 派生索引:设置为0
- 加密数据:使用对方根公钥加密数据
- 签名:使用己方根私钥对加密后的数据进行签名
所有数据均可使用根地址公钥校验,确定数据是拥有根地址的人创建的,或者由分享方创建。这步校验的理由是,创建数据的人知道了加密数据的公钥,伪造一条数据,但是不知道根地址的私钥,所以无法伪造签名。