python写一个区块链防篡改数据库数据的代码,如果数据库数据被改变,代码会检测并将数据重新改回去
时间: 2024-05-11 10:19:57 浏览: 18
以下是一个简单的示例代码,用于检测数据库的数据是否被篡改,并在检测到篡改时重新设定数据。
```python
import hashlib
class Block:
def __init__(self, data, previous_hash):
self.data = data
self.previous_hash = previous_hash
self.hash = self.calc_hash()
def calc_hash(self):
sha = hashlib.sha256()
sha.update(str(self.data).encode('utf-8') + str(self.previous_hash).encode('utf-8'))
return sha.hexdigest()
class Blockchain:
def __init__(self):
self.chain = [Block("Genesis Block", "0")]
def add_block(self, data):
previous_hash = self.chain[len(self.chain)-1].hash
new_block = Block(data, previous_hash)
self.chain.append(new_block)
def verify_chain(self):
for i in range(1,len(self.chain)):
if self.chain[i].previous_hash != self.chain[i-1].hash:
return False
return True
def reset_chain(self):
self.chain = [Block("Genesis Block", "0")]
def detect_tampering(self, data):
for block in self.chain:
if block.data == data:
if block.hash != block.calc_hash():
print("Tampering detected! Resetting data...")
self.reset_chain()
return True
return False
```
在上面的代码中,Block类代表区块链中的一个块,它包含数据、前一个块的哈希值和当前块的哈希值。Blockchain类代表整个区块链,它包含一个块的列表和一些方法来添加块、验证链、重置链和检测篡改。
当你想要添加一个新块时,你可以使用add_block方法。当你想要验证整个链是否正确时,你可以使用verify_chain方法。当你想要重置链时,你可以使用reset_chain方法。最后,当你想要检测某个数据是否被篡改时,你可以使用detect_tampering方法。
使用方法如下:
```python
# 创建区块链并添加一些块
blockchain = Blockchain()
blockchain.add_block("Data 1")
blockchain.add_block("Data 2")
blockchain.add_block("Data 3")
# 检测数据是否被篡改
data_to_check = "Data 2"
if blockchain.detect_tampering(data_to_check):
print("Data has been reset!")
else:
print("Data is secure!")
# 验证整个链是否正确
if blockchain.verify_chain():
print("Chain is valid!")
else:
print("Chain is invalid!")
```
在上面的代码中,我们首先创建了一个区块链并添加了三个块。然后,我们检测“Data 2”是否被篡改。由于我们没有篡改任何数据,所以输出应该为“Data is secure!”。最后,我们验证整个链是否正确。由于我们没有篡改任何数据,所以输出应该为“Chain is valid!”。