alexeichhorn / json-work-proof
JSON Work Proof (JWP) - 工作证明算法
README
JSON Work Proof是一种工作证明算法,在完成一些工作负载后创建一个令牌。这个令牌包含您定义的某些声明,并验证您在此时完成了这项工作,并且针对这些声明。
它将Hashcash算法(在比特币中以类似方式使用)的安全性打包到一个类似JWT的令牌中。
令牌结构
令牌看起来像这样:eyJ0eXAiOiJKV1AiLCJhbGciOiJTSEEyNTYiLCJkaWYiOjIwfQ.eyJleHAiOjE2MTY4NTA1NzAuNjU1MTQ3MSwiaGVsbG8iOiJ3b3JsZCJ9.VE6YYxIQ46lPzxyNuRYAmAMkEM
。它与JWT令牌具有相同的结构,因此也可以在jwt.io的调试器上检查。它包含三个元素,每个都是base64url编码的。头部包含令牌类型(JWP)、用于挑战的哈希算法(目前仅支持SHA256)以及令牌挖掘的难度。有效载荷由您指定的声明和可选的过期日期组成。最后一部分包含一个盐和一个大数(在Hashcash中称为计数器)。生成令牌所需的工作实际上是要找到这个数。找到这个数很难,但验证它是正确的却很容易。(在维基百科上了解更多关于它是如何工作的信息)
可能的应用
可用于防止DDoS攻击或作为速率限制或验证码的替代方案。
例如,您可以使用此功能防止暴力破解用户登录:客户端生成包含用户名和密码等声明的令牌,并将其与登录请求一起发送。然后服务器首先检查令牌是否有效,然后再进行任何查找。因此,暴力破解的规模可以大幅减少。
使用方法
注意:目前PHP中仅支持解码。
通用
要生成和验证令牌,您需要使用一个JWP
对象。在创建时,您可以指定difficulty
,它决定了挑战有多难。默认为20
,在平均计算机上大约需要一秒钟来计算。每次增加一个,难度加倍,因此生成所需的时间也加倍。
use JSONWorkProof\JWP; $jwp = new JWP(); # defaults to difficulty 20 $jwp_harder = new JWP(25);
生成
目前PHP中不支持
验证
检查令牌是否针对特定难度有效,并读取声明
$jwp = new JWP(); try { $claims = $jwp->decode($token); } catch (JSONWorkProof\InvalidFormatException $e) { echo "The token is formatted incorrectly"; } catch (JSONWorkProof\InvalidProofException $e) { echo "The difficulty this token was created at is lower than what is specified in your JWP object"; } catch (JSONWorkProof\ExpiredException $e) { echo "The token expiration is too old or too new"; }
如果您只想读取声明而不验证证明和过期日期,可以使用此方法
$claims = jwp.decode(token, false)
它期望过期日期在现在和30分钟之后。