基于区块链的日志不可篡改化

安全日志的分布式不可篡改化

摘要

许多应用程序需要强大且防篡改的日志系统,例如电子投票或银行信息系统。在Scytl,我们使用一种称为不可变日志的技术,并将其部署于我们的电子投票解决方案中。该技术可确保生成的日志的完整性、真实性和不可否认性,从而在发生任何事件时,审计人员可以利用这些日志进行问题调查。出于安全建议,最好将记录的信息存储和/或复制到记录器没有写入或修改权限的位置。否则,如果记录器被攻破,则可能使用相同的私钥截断或篡改先前生成的数据。这种做法成本较高,且无法防范记录器与持有复制数据的实体之间的串通行为。为解决这些问题,本文提出了一种方案并实现了将安全日志的完整性证明在比特币区块链中进行不可篡改化。由于该方案的特性,即使记录器后续被攻破,也无需进行日志数据复制即可保证不可篡改日志的完整性。

关键词 :安全日志记录 · Blockchain · Distributed不可篡改性 · Integrity · Trust

1 引言

有许多应用程序需要一个强大且防篡改的日志系统,例如电子投票系统[15]或银行信息系统。在Scytl,我们应用了一种日志解决方案,即不可变日志[4],于我们的电子投票系统中[7]以确保生成的日志的完整性、真实性和不可否认性。

如果记录器或其私钥被攻破,则在此时间点之前记录的数据可能会在未被检测到的情况下被截断或篡改,除非采取额外的措施。解决此问题最常见的解决方案有:(1) 将信息存储和/或复制到记录器仅有写权限的位置[1];(2) 实施第三方公证服务[16];或 (3) 使用基于聚合签名的高级密码学机制,该机制以单向函数的形式实现[10]。第一种解决方案由于确保了日志无法被篡改,从而保证了数据的完整性。

用于存储日志的介质,或者由于其复制特性而被检测到。然而,日志复制需要为此部署和管理一个特定的基础设施,该基础设施由一个或多个服务器组成。此解决方案无法防范与记录器共谋的实体。因此,如果需要部署足够大规模的分布式基础设施以防止足够数量的恶意节点共谋,则该基础设施可能成本高昂且难以维护。第二种方案依赖于一个可信服务来存储完整性证明。但该服务也可能与攻击者共谋以篡改日志。第三种方案通过确保日志截断将被检测到,因为无法在日志被截断的位置恢复已存在的聚合签名(详见参考文献)。该方案被描述为两种选择:一种更高效但依赖于基于消息认证码(MAC)的可信方;另一种基于公钥签名和公钥基础设施(PKI),计算开销更高。然而,在本文中,我们探索了一种替代方案,该方案基于一种现有的高效安全日志记录技术,结合了消息认证码(MAC)和数字签名(DA),并利用比特币区块链提供的现成的分布式不可篡改化。该解决方案包括在区块链内发布日志完整性证明。因此,任何日志篡改都将被检测到,并且由于机制的分布式特性,共谋无法实现。

区块链是加密货币比特币[11]所使用的底层技术,作为所有经济交易的公共账本。这些交易以区块序列的形式,由一组称为矿工的节点以分布式的方式进行不可更改地记录。矿工们通过竞争来完成这一操作,并为每个生成的区块获得奖励和费用。区块链的主要优势在于,它能够在无需可信实体的情况下,保障所有注册交易的完整性和不可否认性。

在本文中,我们结合了安全日志和区块链这两种技术,提出并实现了一种将安全日志的完整性证明不可篡改化存储于区块链中的方案。该方案即使在未启用复制的情况下,也能保证不可篡改日志的完整性,即便记录器后续被攻破亦如此。还有其他一些方案也利用了区块链提供的现成不可篡改化能力。例如,Zyskind 等人[18] 提出了一种使用分布式哈希表(DHT)存储数据、并通过区块链保存其访问权限的方式来保护个人数据的系统。此外还有一种规范——彩色币[3],它通过标记比特币并在交易中附加元数据的方式扩展了比特币的功能,这些元数据可能包含指向 BitTorrent 网络中数字资产的链接。还有一些简单的服务,例如存在性证明¹,可为单个文档在区块链上提供有偿的不可篡改化服务。同时也有更复杂的服务,如 Factom[17],能够对任意类型的数进行不可篡改化和链式存储,并收取一定手续费。在这种情况下,该服务被实现为一个具有公共访问权限的许可型区块链[8],该

¹ https://proofofexistence.com.

包含对外部文档的引用。该区块链连接到主比特币区块链以增强可验证性。然而,我们所开展的工作虽然也使用区块链来实现数据的不可篡改性,但与之前的工作不同,原因如下:(1)本工作专门致力于日志的不可篡改化,因此面临若干挑战:(a) 信息必须按照生成时的顺序保持链式连接;(b) 鉴于比特币区块链的速度限制,系统必须能够支持日志生成的速度。(2)我们的方案不需要额外的基础设施,例如中间数据库或私有和/或许可区块链。

文章分为六个章节:第2章介绍不可变日志和区块链;第3章说明该方案;第4章展示实现过程及所进行的测试;第5章讨论在方案设计和实现过程中遇到的一些问题;最后,第6章总结了文章的结论和未来工作。

2 背景

本节介绍了在分布式日志不可篡改化方案中使用的两项技术。

2.1 安全日志

安全日志是一种称为不可变日志的事件日志技术[4]。该技术通过密码学手段确保日志的完整性和真实性,同时不损害系统性能。该系统基于使用消息认证码(MAC)和数字签名(DA)的组合来链接日志条目。每个记录器都拥有一对签名密钥,从而保证了日志的真实性与不可否认性。

日志记录过程包含两种类型的日志条目:常规条目(见公式1)和检查点(见公式2)。每个日志条目(Li)使用MAC加密函数(在所用实现中具体为HMAC[12])与前一个交易进行链式连接。MAC的输入是日志条目文本(LogInfoi)与前一个条目的完整性证明(hi−1)的拼接。多个连续条目使用不同的随机会话密钥(Kj)。该方案可防止对中间条目进行任何修改、删除或添加。

$$
L_i = (\text{LogInfo} i, h_i) \quad \text{where} \quad h_i = \text{HMAC}(K_j, (h {i-1} | \text{LogInfo}_i))
\tag{1}
$$

检查点是一种特殊类型的条目,用于保证最近一个条目块(j)的真实性与不可否认性。根据记录器的配置,每隔一定数量的日志行或特定时间就会生成一个检查点(Chk_j)。在每个检查点中,用于链接最近一个条目块的MAC会话密钥将被公开,同时生成一个新的会话密钥,并通过公钥加密(Penc)保持其机密性。最后,该条目还会附带一个数字签名

$$
\text{Chk} j = L_i = (\text{LogInfo}_i, K {j-1}, E(\text{Penc}, K_j), \text{Sig} j, h {i-1}, h_i) \quad \text{where}
$$
$$
h_i = \text{HMAC}(K_b, (h_{i-1} | K_{j-1} | \text{LogInfo} i))
$$
$$
\text{Sig}_j = S(\text{Ssig}, (h
{i-1} | K_{j-1} | E(\text{Penc}, K_j) | h_i | \text{Loginfo}_i))
\tag{2}
$$

与仅经过数字签名的日志相比,安全日志的主要优势在于能够检测到任何篡改尝试的确切位置,并将该部分与其他保持完好的日志条目隔离,同时保持良好的性能。这些日志还可以通过发送到集中所有日志信息的中央日志服务器进行日志复制,以确保日志的可用性并提供日志监控。日志复制还确保了被攻破的记录器无法修改之前的条目,例如通过截断并重新生成日志条目链的方式。

2.2 比特币区块链

比特币[11]是一种著名的去中心化加密货币系统。该方案基于一个共识网络,所有节点根据一组特定规则对系统的状态达成一致。没有中央机构来操作或控制货币。一组称为矿工的节点负责系统运行,更具体地说,负责生成用作公共账本的区块链。

从高层来看,系统的运作为:用户生成代表加密货币转账的交易,以及矿工对这些交易进行验证并使其不可篡改。每笔交易(见图1)包含一个或多个先前交易的引用,即输入(Ik),用以证明用户拥有其正在花费的资金,以及所花费资金的数量和接收方,即输出(Ol)。输入是一个元组列表,包括交易标识符(Txid)以及该交易中某个输出的索引(φp)。存在多种类型的交易输出,但最常见的是支付到公钥哈希(Pay-to-PubkeyHash),它指向一个比特币地址(@l),该地址是公钥的哈希值,并指定发送到该地址的资金数量(θl)。此类输出只能由持有对应私钥的实体进行花费。因此,每笔交易都包含赎回其所引用的先前交易资金所需的公钥和签名。使用基于secp256k1曲线的ECDSA签名算法[14]。一笔交易转移的资金总额为其所有输入之和。然而,其中一小部分金额,即输入与输出之间的差额,将作为发布费用被矿工收取。交易通过支持该系统的分布式网络由矿工进行发送和验证。此后,它们将公开可用,因此所有的资金交换均可公开审计。尽管区块链最初的职能是作为比特币账本,但也可以在每笔交易中发布少量信息

示意图0

输出。这在下一节提出的方案中使用,通过使用操作码 OP RETURN 创建一种特殊类型的输出(称为不可花费输出)来实现。在此操作码之后,最多可包含 75 字节的信息,这些信息将随交易一并发布。

比特币交易在区块链内进行注册和不可篡改存储,从而提供完整性、公开可审计性和不可否认性。区块链是一系列通过密码学方法链式连接的区块,其中包含交易。矿工通过一个需要解决工作量证明(PoW)的竞争过程来生成区块。每个区块包含一组交易以及一个区块头,该区块头引用前一个区块,包含用于工作量证明的随机数,以及一个哈希值,该哈希值是将区块中所有待不可篡改存储的交易分组的默克尔树的根。交易作为默克尔树的叶子以特定顺序被不可篡改存储,但此顺序由矿工决定,并非由交易发起者选择。工作量证明的生成过程是通过尝试不同的随机数,寻找满足特定前导零数量要求的区块密码学哈希值。为使平均每十分钟产生一个区块,工作量证明的复杂度每两周调整一次。当矿工成功解决工作量证明并发布一个区块时,其将获得一定数量的比特币作为奖励以及该区块中每笔交易所附带的手续费。在假设没有任何实体拥有超过51%算力的前提下,工作量证明机制可用于:(1)防止某个特定实体刻意选择发布某个区块到区块链中;(2)防止已发布的区块被篡改。此外,也存在其他不依赖于计算性能的机制[2],但这些机制实现在替代币中。

3 分布式日志不可篡改

如第2.1节所述,安全日志为生成的日志提供完整性和真实性。此外,日志可以发送到中心服务器,以确保其可用性并提供监控。

但日志的复制也是一种理想的安全特性。它可确保在记录器被攻陷、记录器签名密钥泄露或日志被截断的情况下,通过将先前的日志条目与复制的信息进行比较,从而检测到对这些条目的篡改。然而,该解决方案需要一个用于复制信息的服务器基础设施、一种导出日志的机制,以及一种在不同副本之间出现差异时确定哪些信息有效的协议。

在本节中,我们提出了一种分布式日志不可篡改化解决方案,该方案结合使用安全日志[4]和区块链。该解决方案无需日志复制即可检测上述篡改行为(尽管仍支持日志复制以实现持久性和容错性)。该方案利用区块链分布式发布并实现日志完整性证明的不可篡改化。

3.1 分布式不可篡改方案

安全日志会定期发布一种称为检查点的特殊日志条目。该条目中包含的信息可用于验证当前检查点与上一个检查点之间所有日志条目的区块。因此,我们提出的分布式日志不可篡改化方案是:每次发布检查点时,都将一个完整性证明(即哈希值)发布到区块链中。这些完整性证明之后可与实际的日志文件进行比对,以确认其未被篡改。每一个在区块链中实现不可篡改化的日志都将拥有一个日志标识符,用于区分同一实体所不可篡改化的其他日志,因此该标识符并非全局唯一。

注册到区块链上的完整性证明是日志中检查点的SHA256哈希[13](Chkj)(见第2.1节中的公式2):

$$
H_j = \text{SHA256}(\text{Chk}_j)
\tag{3}
$$

单笔交易中可包含一个或多个检查点哈希(Txid)。这有助于解决区块链可扩展性限制问题(见第5节),并能减少总的交易费用。每个哈希包含在交易的一个不可花费的输出项中(Ol其中 l > 0)。以下信息被发布(各字段的描述见表1):

$$
O_l = (\text{prefix}, \text{version}, \text{logId}, H_j)
\tag{4}
$$

为了正确地根据区块链中发布的检查点哈希验证日志,需要维护并确保其顺序。由于多个检查点哈希可以包含在单个交易中,因此必须在交易输出级别上保证顺序。当存在多个交易时,也必须保持该顺序。因此,对于第一种情况,这些哈希按照其在日志文件中出现的顺序作为输出(Ol)包含在交易中,而该顺序由比特币的设计天然保证。对于第二种情况,通过交易输入(Ik)将每个交易链接到前一个交易。

名称 字节数 内容 描述
prefix 2 “SL” OP RETURN 前缀
version 1 1 数据结构版本
logId 16 - 唯一日志标识符
Hj 32 - 检查点哈希

因此,应用程序生成的交易相互链接,形成一条交易链(见图2)。如图所示,每笔交易包含一个或多个来自具有可花费输出的交易的输入,用于支付当前和未来的交易费用,以及一个带有可花费输出的单一输出,该输出将与下一笔用于注册检查点哈希的交易相链接。此外,该交易还包含注册检查点哈希所需的所有不可花费输出。需要明确的是,已发布的交易并非通过其可花费输出直接与下一笔交易相连。该输出指向一个地址,每个已发布²交易的地址都不同,且属于记录器或注册应用。然而,只有记录器应用才能花费该输出,因此只有记录器能够将其作为输入链接到下一笔包含检查点哈希的交易中。

² 尽管比特币的实现并未强制要求,但社区建议不要重复使用比特币地址。因此,我们决定为生成的每笔交易重新生成接收地址。

示意图1

为了遍历生成的交易链并检索给定日志的完整性证明,需要公开该链的首个交易和日志标识符,例如在报纸上或由区块链中的可信实体发布。

3.2 验证方案

已发布信息的验证包括检索所有已发布的检查点哈希,使用日志文件重新计算这些哈希,并比较它们在内容和顺序上是否匹配。我们假设日志文件的内容和区块链的内容已通过常规的记录器和区块链验证机制进行了验证。记录器发布的首个交易以及日志标识符必须为公众所熟知。

执行验证所使用的算法如算法1所示。该算法首先遍历记录器在区块链中发布的和注册的所有交易(算法中的第一个while循环)。将首个交易(firstTransaction)作为链的可信起点,并使用日志标识符(logId)选择相应的条目(如果不同日志的检查点哈希被包含在同一笔交易中)。检查点哈希被临时存储(WriteHashes)到一个文件中(fileHashesBC)。然后搜索并处理下一笔交易(GetNextTransaction)。如算法2所示,查找下一笔交易需要遍历区块链的当前及后续区块(算法的外层while循环),直到找到一笔以当前交易为输入的交易为止(算法的内层while循环)。在从区块链中收集完检查点哈希后(再次参考算法1),通过实际的日志重新计算检查点哈希(ComputeHash)(算法中的第二个while循环),并将它们临时存储(WriteHashes)到另一个文件中(fileHashesSL)。最后,检查两个包含检查点哈希列表的文件(fileHashesBC 和 fileHashesSL)是否完全一致(CompareFiles)。如果一致,则验证通过。

数据:首个交易, 日志ID, 日志, 区块链, 文件哈希BC, 文件哈希SL  
结果:布尔结果  
transaction = 首个交易;  
while there is transaction do  
    hashes = 获取哈希(transaction, logId, blockchain);  
    WriteHashes(hashes, fileHashesBC);  
    transaction = 获取下一个交易(transaction, blockchain);  
end  
while there is a log file do  
    logFile = 获取下一个日志文件();  
    while there is a log line to read do  
        line = 读取行(logFile);  
        if line is a checkpoint then  
            hash = 计算哈希(line);  
            WriteHashes(hash, fileHashesSL);  
        end  
    end  
end  
CompareFiles(fileHashesBC, fileHashesSL);  
算法1. 验证算法
数据:区块链,当前交易  
结果:下一笔交易  
blockHash = 获取区块交易(currentTransaction);  
while there is a blockHash do  
    block = 获取区块(blockHash);  
    while there are pending transactions in block and transaction not found do  
        nextTransaction = 获取交易(block);  
        inputs = 获取交易输入(nextTransaction);  
        if 列表包含(inputs, currentTransaction) then  
            return nextTransaction;  
        end  
    end  
    blockHash = 获取下一区块(block);  
end  
算法2. 获取下一个交易算法

如果在生成安全日志检查点后的特定时间段内将检查点哈希注册到区块链中,则也可以验证时间的正确性。在这种情况下,验证过程中需要收集并比较日志检查点的时间戳(属于日志基本信息)以及每个检查点哈希通过交易链接到的区块链区块的时间戳。这些时间戳在验证器定义的特定容差范围内必须匹配。该容差取决于检查点哈希生成与其在区块链中不可篡改化之间的延迟。

4 实现与测试

上一节中描述的方案已作为两个真实的Java应用程序实现:一个不可篡改化器和一个验证器。这两个应用程序与安全记录器生成的日志以及比特币核心软件进行交互。

4.1 分布式不可篡改化应用

不可篡改化器应用程序已被构建为一个独立Java应用程序,该程序定期读取安全日志文件,以将新检查点的完整性证明注册到区块链上。该应用程序利用btcd-cli4j库³作为Bitcoin Core 0.12版本提供的RPC-JSON调用的Java封装⁴来访问和操作区块链。

³ https://github.com/priiduneemre/btcd-cli4j.
⁴ https://bitcoin.org/en/bitcoin-core/.

当应用程序启动时,如果是首次运行,则会生成一个新的随机日志标识符并读取所有可用的日志文件。然后计算检查点的哈希值,创建一个包含这些哈希值的交易,并对其进行签名。

从这一点开始,应用程序会定期读取日志文件以检测需要注册的新日志行。检查点哈希的注册周期是可配置的,但不应超过交易被不可篡改化和确认所需的时间(通常一笔交易在其被包含进区块链后的第六个区块时被视为已确认,尽管这也是一个可配置的参数)。这意味着在生产环境中,该周期至少应为一小时。每次发布交易时都会保存状态,因此如果应用程序停止,可以从相同的状态和相同的标识符处恢复。

该应用程序创建的交易包含与哈希数量相等的输出,外加一个用作找零地址的输出。交易所需支付的手续费通过RPC-JSON EstimateFee调用来计算,该调用会估算在特定数量的区块内(本应用程序中设为1个区块)发布一笔交易所需的相对手续费。如果无法获取估算值,则采用0.0002 BTC/kB的硬编码值。用于计算手续费的大小包括基础交易的200字节,以及每个输出额外增加的60字节。此计算方式的目的是以及时性方式使交易被包含进区块,同时避免支付过高的手续费。在计算出手续费后,该交易将与前一个交易关联,并在可用比特币不足以支付手续费时,关联其他可花费交易。

还值得一提的是,Bitcoin Core并未提供RPC-JSON调用,以使用交易来实现除比特币支付之外的其他数据的不可篡改性。然而,存在一组调用,允许在二进制级别上操作交易。因此,所采用的方法是针对每个要注册的数据条目,使用CreateRawTransaction RPC-JSON原语创建一个交易虚拟输出。该交易以十六进制编码返回,每个虚拟输出随后被手动定制的输出所替换,该输出包含OP_RETURN代码以及要注册的哈希值。

4.2 验证器应用

验证器应用还被构建为一个独立Java应用程序,该程序利用btcd-cli4j库作为 Bitcoin Core 0.12.1的RPC-JSON调用的Java封装。在此情况下,该应用程序从给定的初始交易开始,针对特定日志标识符,下载发布到区块链上的所有检查点哈希,从日志文件生成检查点哈希,并进行比较。尚未实现时间检查。

应用程序需要不可篡改化器注册的第一个已知交易的标识符以及分配的日志标识符。然后按照算法1中描述的算法执行验证。

4.3 测试

不可篡改化器和验证器的测试已通过安全日志生成器以及作为全节点在比特币测试网中运行的Bitcoin Core 0.12.1完成。

已启用生成器和不可篡改化器以生成日志。日志生成器已设置为每5秒生成一条日志,每5分钟生成一个日志检查点,并每小时轮转一次日志文件。日志不可篡改化器已设置为每小时生成一笔交易,该交易与至少经过3个区块确认的已确认交易相关联。当执行验证器时,日志检查点完整性已成功根据区块链上发布的信息进行了验证(目前尚未实现为周期性机制)。

我们执行的测试之一包括对在大约8小时内生成的101个检查点进行不可篡改化。日志标识符为:
8e4b943f45506c876a93ff4b113da68f
以及生成的首个交易为:
59f5167416ecf96c8101d1cafce92075f4504b37548b92b6157ac966fee102d9
可以通过Block Trail等区块链浏览器查看⁵。通过此交易,可以在9笔交易期间跟踪日志轨迹,其中包含生成的101个检查点。

⁵ https://www.blocktrail.com/.

5 讨论

在本节中,我们将讨论在该解决方案的设计和实现过程中所做的设计决策、该方案的可扩展性和成本,以及其安全性。

5.1 设计决策

如第2.2节所述,区块链是一个持续增长的分布式数据库,由区块和交易组成。这些区块被组织成一个序列,每个区块通过哈希与前一个区块相连。交易则使用其标识符链接到区块,该标识符是通过交易元素计算得出的哈希值。这种结构适合保持信息完整性及其顺序。然而,它的缺点是,查找特定交易需要下载并索引所有数据(目前约为64GB),除非我们知道该交易位于哪个区块中。

因此,我们最初提出的问题之一是,在保持顺序的前提下,如何最恰当地组织日志不可更改器的完整性证明(即检查点哈希)。我们选择的方法是在交易中按自然顺序包含完整性证明,并使用交易输入字段将这些交易链接成一个序列。另一种考虑过的方案是在应用层强制排序,即在每个条目中包含当前和前一个检查点哈希。然而,该方案因两个原因被放弃:(1)需要读取、处理并排序从包含我们交易的第一个区块开始的所有交易输出中的数据,(2)它没有意识到比特币机制在保持数据顺序方面的作用,而且(3)当每笔交易使用不同的密钥对时,会加剧数据真实性的保护复杂性(见下文段落)。

另一个问题是,如何保持完整性证明的真实性。这可以通过对发布的交易进行加密签名来实现。在比特币中,交易发送到的地址与一对加密密钥相关联。然而,标准行为是为每笔收到的交易自动生成一个新的地址。因此,当有新的交易发送给某个实体(例如记录器)时,该实体将拥有多个地址。所发布的交易需使用对应被花费交易所属拥有者的密钥进行签名。这使得使用一个众所周知的固定地址作为不可篡改化器的做法并不可取。另一种可能性是公开记录器生成的所有密钥对,但这种方法无法保证不可否认性属性。对于某笔特定交易,不可篡改化器可以声称该密钥对并非属于它,因为不存在PKI基础设施。因此,采用的方法如下:(1)将包含日志完整性证明条目的首个交易在可信场所公开;(2)不可篡改化器仅生成具有唯一可花费输出、并发送至其自身控制地址的交易(只有它能花费该输出)。因此,如果首个交易及其关联地址是可信的,则后续所有交易也可被信任。该方法不允许在不可篡改化完成后将最后一笔交易的找零返还给其他实体,否则该实体可能继续链式操作并添加伪造条目。但我们假设不可篡改化器可以继续处理其他日志,或仅管理少量资金以支付少量手续费。如果需要,也可以添加带有操作码的字段,用于标明日志不可篡改化的开始和结束。另一种可能性是创建一笔不发布检查点哈希的交易以捐出剩余资金,将其视为日志不可篡改化活动结束的信号。

另一个问题是,我们如何提高已发布数据的可见性。如前所述,所选择的解决方案是公开已发布完整性证明的第一笔交易ID。因此,通过跟踪所述链即可找到其余条目。此外,还包含了一个日志标识符,以区分来自其他被不可变化的日志的完整性证明。然而,不能仅依赖日志标识符,因为任何实体都可以自由地在区块链上使用任意日志标识符注册交易。另一种方案是使用一个单一的知名地址作为所有已签发交易的找零地址。但由于之前提到的地址再生机制,该方案已被放弃。

5.2 可扩展性与成本

该解决方案的另一个重要方面是其可扩展性。比特币的区块链目前总共仅支持每秒7笔交易[5]。关于如何提高这一数值存在大量讨论,因为对于一个全球使用的系统。考虑到这一限制,我们决定以日志检查点为单位,周期性地注册日志完整性证明,并在每笔交易中包含一个或多个条目。日志还必须进行调整,以生成不会导致交易过大的检查点数量。交易越大,手续费越昂贵,被包含进区块的概率也越低。因此,该方法使得系统能够在可扩展性、安全性和交易费用之间取得权衡。例如,在我们的测试中,我们每小时创建一笔平均大小为1千字节的交易。考虑到上述大小和当前1MB区块大小限制,在全球规模上最多可同时固化6000个并发日志。这个数值并不大,特别是考虑到当前区块几乎已在其最大容量下运行。

另一个需要考虑的方面是该解决方案的运营成本。比特币与交易发布相关联的成本有关。平均费用波动较大,但如果希望交易确认没有延迟,则必须支付0.0006 BTC/KB的费率⁶(数据截至2016年8月5日)。例如,如果我们设置记录器每小时生成12个检查点,每小时发布1笔比特币交易,持续一个月,成本约为203€每月。在此示例中,每笔交易的大小接近1KB,费用为0.0006 BTC,约合0.31€。这是一个近似成本,取决于系统配置,由我们在公式5中详细说明的成本模型得出。该模型考虑了单位时间内的检查点数量(c)、单位时间内的交易数量(tx)、给定可接受的最大发布延迟下的交易费用(f)以及运行时间(t)。该模型假设每笔交易的基础大小为0.2千字节,加上每个包含的检查点增加0.06千字节。所选的时间单位为小时。由于交易费用可能上升,最终得到的成本未来可能会增加(f)。目前大多数矿工的利润来自区块工作量证明(PoW)被解决时的奖励,但该奖励每210,000个区块(大约每4年)减半一次。因此,未来奖励将减少,交易费用很可能会上涨。

$$
\text{cost} = ((tx \times 0.2) + (c \times 0.06)) \times t \times f
\tag{5}
$$

⁶ https://bitcoinfees.21.co/.

5.3 安全性

所提出的解决方案增强了安全日志在应对内部攻击时的数据完整性、流完整性(数据顺序)、前向完整性(确保被攻破前的数据无法被篡改)以及不可否认性。因此,所针对的威胁模型主要关注那些攻陷日志记录器或能够访问日志和/或其私钥的攻击者。此类情况下的威胁包括:(1)伪造完整日志,(2)日志截断,以及(3)伪造过去的日志条目。

如威胁1所述,伪造或替换所有日志是不可能的,因为这需要替换或修改首个交易,以指向一个替代手工链的不可篡改日志链。如果首个交易的标识符在系统运行初期已被公开并广泛传播(例如,该标识符可发布于报纸等媒体),则该首个交易无法被替换。即使此首个交易标识符被替换,除非真实日志与被替换的日志在同一时间创建并注册到区块链上,否则区块的时间戳将与预期时间不匹配。此外,如果首个交易标识符未被替换,则对该交易的修改也是不可行的。一旦区块链中的数据被确认(通常是在六个区块链式连接到待确认区块之后),几乎不可能再对其进行修改。

如威胁2和3中所述,任何对日志的篡改,只要影响了已提交到区块链中的日志区块,都将被检测到。原因是覆盖日志每个区块完整性的日志检查点哈希将与已发布的哈希不匹配。需要注意的是,如果篡改影响的是当前区块或未发布区块,攻击者仍有机会进行篡改。因此,检查点哈希在区块链中发布的频率越高,对日志中未发布区块的数据进行篡改的机会窗口就越小。

为了更高的安全性,还可以在日志的首批条目之一中发布首个交易的标识符,从而利用区块链上公布的信息对日志创建承诺。

在比特币层面还可能尝试其他攻击。常见的攻击,例如双花攻击[9]在此情况下不适用,因为记录器是针对自身发起交易的,因此不存在与此攻击相匹配的威胁模型。另一种可能是记录器与矿工勾结进行自私挖矿[6]。在这种情况下,记录器将尝试分叉并构建一条交易并行链,以在区块链的并行分支中实现日志的不可篡改性。然而,由于这需要至少拥有总算力的四分之一,因此在整个日志生命周期内持续维持这种攻击将非常困难。

6 结论

在本文中,我们提出了一种基于比特币区块链的方案,用于增强不可变日志[4]的安全性。该方案提供了额外的完整性与不可否认性安全属性,能够抵御记录器或其签名密钥被攻陷情况下的日志截断和日志重新生成。该方案的核心是在区块链中发布日志完整性证明。此类保护也可通过在由独立实体运营的不同选定服务器上或在分布式网络内建立日志复制机制来实现。然而,借助区块链,上述安全属性可现成获得,无需进行日志复制,并可在全球范围内扩展不可篡改化。在此情况下,不可篡改化者即为比特币矿工,这些实体在全球范围内不会轻易受特定利益方操控。

一个潜在的被攻破的记录器或攻击者。由于区块链的设计,不可篡改的信息无法被任何人修改,除非其拥有超过系统50%的挖矿能力。

通过提出的方案及其实施,表明区块链可用于所述目的。然而,我们也讨论了当前存在的局限性。如果区块链支持的交易数量和区块大小不增加,则在全球规模下不可篡改化的日志数量将无法很大,且日志的不可篡改化频率和检查点数量必须保持非常低。由于容量有限,作为副作用,交易费用也较高,以确保交易发布没有延迟。因此,为了商业上使用此解决方案,区块链应提供比当前更大的容量,或者用户必须愿意支付高昂的运营成本。

为进一步完善我们的规范,还可以开展更多工作,例如支持日志终态化。目前,我们的规范尚未包含将用于注册资产的交易中的累积资金转移到不受记录器控制的地址。否则,该地址的所有者可能会针对给定的日志标识符,使用伪造的完整性证明继续构建链条。如果某笔交易包含指示日志不可篡改化已终态化的信号,则后续交易中的任何其他完整性证明均可被忽略。此外,验证器在验证日志时也将更加高效,因为它在发现该信号后即可停止验证。在实现方面,还可以进一步开展工作以支持多个日志的分布式不可篡改化,因为当前仅支持单个节点。最后,可扩展验证器以检查区块链中发布的完整性证明的时间是否与特定时间范围内安全日志条目所要求的时间相匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值