phptek / verifiable

通过参考区块链或Merkle存储,验证数据是否已更改。

安装: 36

依赖关系: 0

建议者: 0

安全: 0

星标: 9

关注者: 3

分支: 3

开放问题: 21

类型:silverstripe-vendormodule

1.0-beta1 2018-11-04 08:49 UTC

README

Build Status Scrutinizer Code Quality License

这是什么?

SilverStripe内容作者可以验证他们的内容是否被篡改。

这是一个可配置的数据和内容验证模块,用于SilverStripe应用程序。它为内容作者和开发者提供独立的数据完整性验证。数据可以独立于SilverStripe及其数据库进行验证,并且可以在任何时间进行。该模块还可以通过强大的API进行扩展。

背景

几十年来,软件用户一直理所当然地认为他们的数据是安全的,不受篡改。开发者、供应商和数据库管理员不会未经授权修改数据或代码,无论是否有恶意。简单来说:用户之所以将信任放在这些实体上,只是因为他们可能听起来像知道自己在做什么。

没有中央化的IT可以声称不可变。因此,此模块提供可验证性;数据在任何时间点都可以通过数学证明其完整性。如果数据在不应更改时更改,那么需要知道的人可以知道。

识别不当行为和负面结果并不是可验证性的唯一应用。可验证性是一个与其密切相关的领域,即去中心化运动,以加密货币和无需许可的区块链网络为典型代表。可验证性还关注公共数据中的透明度和问责制,此模块将帮助实现SilverStripe应用程序的这一点。

没有任何配置;模块的默认设置提供了一个简单的管理界面,允许验证特定版本的任何版本化 DataObject的内容自发布以来没有更改。

它是如何工作的?

在最基本的配置下;在每次数据库写入操作中,创建所选字段数据的sha256哈希,并将其提交给一个实现Merkle或二进制哈希树的单独后端系统。此后端可以是本地或远程不可变或半不可变的数据存储,或者是对这两种类型的代理数据存储。

我们知道的两种符合此类服务性Merkle后端条件的服务是;公共区块链(特别是比特币和以太坊)以及独立或集群化的Merkle树存储系统,如Trillian

除了处理和持久化其原生加密货币中的价值交易外,比特币和以太坊区块链还可以存储有限大小的任意数据,前者通过其OP_RETURN操作码。这使得它们非常适合存储Merkle Root哈希,可以从其中数学地导出单个"叶子"哈希。

模块的默认Chainpoint适配器使用对Chainpoint网络的REST调用。Chainpoint会定期将Merkle Root哈希写入比特币区块链。

开发者也可以自由且能够使用模块的可插拔API与不同的后端集成。请参阅下面的"扩展"部分。

alt text

alt text

要求

  • 至少PHP7和SilverStripe 4。
  • PHP配置以下以解码从Chainpoint REST API调用返回的二进制格式证明
  • allow_url_fopen在php.ini中启用。

安装

#> composer require phptek/verifiable

验证包

该包附带一个CHECKSUM文件,可以用来验证包内容自被推送到GitHub以来是否被篡改。只需切换到“可验证”目录,运行以下命令,并将输出与CHECKSUM文件进行比较。如果CHECKSUM文件丢失,您仍然可以将其与GitHub上等效构建的文件进行比较

#> diff CHECKSUM <( ./tools/checksum.sh true )

配置

通过SilverStripe的YML配置API配置所需的后端,例如在自定义的app/_config/verifiable.yml文件中

---
Name: mysite-verifiable-chainpoint-backend-config
After: '#verifiable-chainpoint-backend-config'
---
PhpTek\Verifiable\Backend\VerifiableServiceFactory:
  backend: mybackend

VerifiableExtension添加到您希望进行“可验证”的每个数据模型

My\Name\Space\Model\MyModel:
  extensions:
    - PhpTek\Verifiable\Extension\VerifiableExtension

对于SilverStripe 4的File

SilverStripe\Assets\File:
  extensions:
    - SilverStripe\Versioned\Versioned
    - PhpTek\Verifiable\Extension\VerifiableExtension
SilverStripe\AssetAdmin\Forms\FileFormFactory:
  extensions:
    - PhpTek\Verifiable\Model\VerifiableFileExtension

默认情况下,您在verifiable_fields数组中定义的任何装饰模型上的字段都将被哈希并提交到后端,因此

My\Name\Space\Model\MyModel:
  verifiable_fields:
    - Title
    - Content

当在File类及其子类上声明verifiable_fields时,文件本身的内容也将被考虑在内,并将其包含在生成的哈希中,以及每个数据库字段的值。

开发人员还可以提供自己的数据进行哈希和提交。只需在任何带有VerifiableExtension装饰的DataObject子类上声明一个verify()方法,其返回值将被哈希并提交到后端。例如

class MyDataObject extends DataObject
{

    /**
     * Take the contents of a file for a very basic form of digital notarisation.
     * 
     * @param string $filename 
     * @return string
     */ 
     public function verify(string $filename) : string
     {
         return file_get_contents($filename);
     }
}

请确保通过浏览器或CLI运行flush=all以刷新SilverStripe的YML配置缓存。

您还需要在托管环境中安装一个简单的cron作业,该作业调用UpdateProofController。这将定期查询后端以进行全证据检查(仅限于Chainpoint后端)。

./vendor/bin/sake verifiable/tools/update

扩展

开发人员可以通过强大的API扩展此模块。

  1. 开发人员可以自定义要哈希和提交到后端的数据。

开发人员可以修改DataObjectverifiable_fields(见上文)以哈希更多字段;或者,通过在任何装饰的版本化 DataObject子类上声明verify()方法,模块将在每次写入时调用它。此方法的用途可能包括对上传的File对象进行认证或使用SilverStripe成为下一个NewsDiffs。请参阅上面的配置部分。

  1. 开发人员可以构建替代后端适配器。

此模块预先配置了用于Chainpoint网络的后端。但如果您想使用其他不可变数据存储或简单的替代Merkle-to-Bitcoin系统,则可以这样做。请查看“src/Backend”目录中的GatewayProviderServiceProvider接口,以及BackendServiceFactory以了解后端是如何实例化的。一旦您开发了后端,请参阅上面的“配置”部分,了解如何覆盖模块的默认“Chainpoint”后端。

已知问题和注意事项

版本1.x

  • 对于File对象;对系统中的任何调整大小的图像所做的更改不会被标记为篡改的证据。Verifiable只会检测对原始图像文件的更改。
  • 请注意,在发布内容时(例如SiteTree),由于需要向Chainpoint网络发出网络请求,因此将出现轻微的延迟。

背景阅读

支持我

如果您喜欢您所看到的,请支持我!我接受比特币