Proof_Of_Work机制

简单理解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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ATFWUS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值