当前位置:首页 > 区块链新闻 > 正文

如何使用Python编写一个简单且安全的区块链数据库API?

来源: 互联网时间:2017-10-30 14:00:00

GitHub项目链接:https://github.com/adamchinkc/blockchain_database

当我们讨论区块链时,我们总是把它与p2p网络联系起来,认为数据必须分散在网络上。这也会使人们担心区块链将会破坏数据的机密性。

事实上,区块链本身的数据架构已经为保护数据免受未经授权操作提供了一个好的解决方案,并且考虑到服务器受到足够的控制(如访问控制、网络和系统安全控制)的保护,最好是在内部网络。

因此,我尝试通过使用Python, Sqlite和RESTful API框架基于区块链的数据架构创建一个数据库。

区块链的数据架构及其完整性

gsCt1MspoQyA

摘自于中本聪发表的比特币白皮书《比特币:一种点对点电子现金系统》https://bitcoin.org/bitcoin.pdf

从上图看,每一个数据区块都包含了上一个哈希(Prev Hash)Nonce交易(Tx)。如果你不确定什么是哈希(Hash),你可以先阅读这篇文章进行了解。简而言之,哈希值是上一个区块的一个独一无二的ID。如果我们使用这个“独一无二的ID“来验证上一个区块,我们将会知道上一个区块是否被更改了。

这意味着什么?这种机制允许我们确保任何人都不被允许更改先前创建的数据。如果你需要修改数据,那么你就必须创建另一条记录以“修改”或“删除”它。

_g58C_aNixnw

在上面的例子中,Alice错误地输入日记条目到了123.4,而正确地应该是432.1。Alice必须创建另外的记录“删除”推翻此前输入的条目。

这似乎是大多数审计系统的基本职能,但是我们并不能知道这个系统在应用层上是否被控制住了,这就造成了数据可能在数据库层被更改的可能性。

要确保从始至终没有人能够更改数据,我引入了一种简单且安全的区块链数据库API。

基于区块链数据架构的数据库

7oDh_zLTFm-w

可审计性,保密性和完整性

当用户创建一个交易记录时,他将会使私钥对交易数据进行加密并将这个数据发布到区块链数据库API。区块链数据库API将使用该用户的公钥对数据进行解密。在这个过程中,用户的身份已经被确认。这就实现了可审计性和保密性的目标。

在下一步中,这个区块链数据库API将会计算出nonce交易的哈希值,即随机字符串和上一个哈希。区块链数据库API将把这个交易,nonce和哈希插入到这个数据库中。

要删除未授权的更改,区块链数据库API将基于上一个哈希,交易和nonce的信息重新计算这个哈希值。如果出现了任何更改,这个哈希值将发生变化,这个API将被通知发生了变化。从而,数据的完整性将会得到保证。

局限性

由于处于一种中心化架构中,获得管理权限的攻击者有可能会通过再次重新这个哈希值来改变整个数据库。

这个问题可以通过以下解决方案来解决:

•将此交易克隆岛一个安全的日志服务器

•以增量方式进行数据备份而不是全球备份

如何使用这个API?

1.启动哈希API

python hash.py

2.启动Nonce API

python nonce.py

3.启动Main API

python main.py

4.发布日记数据到Main API http://127.0.0.1:8000/construct,获得带有nonce和哈希的Response。

data1 = { 	"journal_id": "JE000001", 
	"entry_date" : "2016-11-06", 
	"create_time" : "2016-11-06 18:00:00", 
	"created_by": "Adam",
	"post_status": "P",
	"account_code" : "100000",
	"amount" : 16453.24,
	"dr_cr" : "C"
}

5.发布Response到Main API http://127.0.0.1:8000/insert

data1 = { 	"journal_id": "JE000001", 
	"entry_date" : "2016-11-06", 
	"create_time" : "2016-11-06 18:00:00", 
	"created_by": "Adam",
	"post_status": "P",
	"account_code" : "100000",
	"amount" : 16453.24,
	"dr_cr" : "C",
  "nonue" : ".....",
  "hash" : "....."
}

6.通过Get http://127.0.0.1:8000/verify?id=1验证您的交易。

免责声明:

1.本文内容综合整理自互联网,观点仅代表作者本人,不代表本站立场。

2.资讯内容不构成投资建议,投资者应独立决策并自行承担风险。