简单理解Proof_Of_Work机制,实现简单的Proof_Of_Work机制。
1.Proof_Of_Work
- Proof_Of_Work 简单理解,就是工作量证明,用来证明你做过一定量的工作。是一种应对拒绝服务攻击和其他服务滥用的经济对策。
- Proof_Of_Work 在区块链技术中应用广泛。
2.简单实现(辅助理解)
- Proof_Of_Work通常是一个复杂的工作量证明系统,这里简单的给出一种实现,辅助理解这种机制。
服务方
- 服务方想部署一个简单的python程序,python程序的开头有这样的proof_of_work机制:
import string
import hashlib
import random
import socketserver
def proof_of_work():
print('[*] proof of work...')
alphabet = string.ascii_letters + string.ascii_uppercase
original = ''.join([alphabet[random.randint(0, len(alphabet) - 1)] for _ in range(16)])
HASH = hashlib.sha256(original.encode()).hexdigest()
return original[:4], original[4:], HASH
class server(socketserver.BaseRequestHandler):
def _recv(self):
data = self.request.recv(1024)
return data.strip()
def _send(self, msg, newline=True):
if isinstance(msg , bytes):
msg += b'\n'
else:
msg += '\n'
msg = msg.encode()
self.request.sendall(msg)
def handle(self):
START, END, HASH = proof_of_work()
self._send('SHA-256(?+{}) == {}'.format(END, HASH))
RCV = self._recv().decode()
if RCV != START:
print('[error] out of work!')
return
print('[✔] proof of work!')
print("[✔] server....")
class ForkedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
if __name__ == "__main__":
HOST, PORT = '0.0.0.0', 7777
server = ForkedServer((HOST, PORT), server)
server.allow_reuse_address = True
server.serve_forever()
- 需要用户碰撞出原始串的前四位,才能进行下面的服务。增加了客户方攻击的计算成本。
客户方
- 客户方要想使用服务方的服务,需要碰撞出原始串的前四位。
from pwn import *
import string
from hashlib import sha256
import itertools
from tqdm import tqdm
r = remote('127.0.0.1', 7777)
# context.log_level = "debug"
ALPHABET = string.ascii_letters + string.digits
rec = r.recvline().decode()
print(rec)
suffix = rec[rec.find('+')+1:rec.find(')')]
digest = rec[rec.find('==')+3:-1]
print(f"suffix: {suffix} \ndigest: {digest}")
for i in tqdm(itertools.product(ALPHABET, repeat=4)):
prefix = ''.join(i)
guess = prefix + suffix
if sha256(guess.encode()).hexdigest() == digest:
log.info(f"Find XXXX: {prefix}")
break
r.sendline(prefix.encode())
测试效果
- 客户方碰撞出前4位:
- 服务方提供服务:
ATFWUS 2021-08-22