开奖验算
抽奖使用「先承诺、后揭晓」:报名开始时就把种子的 SHA-256 摘要公开,开奖后才公布种子原值。
只要你知道参与名单,就能在浏览器里把中奖名单重新算一遍,看是否与公示一致。
算法与后端实现逐行对应:commit = SHA-256(seed),score = HMAC-SHA256(seed, draw:v1:…)。
这套算法怎么算
与后端一字不差 算法:HMAC-SHA256 打分
每条报名取
score = HMAC-SHA256(seed, "draw:v1:<活动ID>:<报名ID>")
,输出小写十六进制后按 score 升序排(同分按报名 ID 升序),取前
prizeCount 名。
后端 drawScore()(src/lib/lottery.ts:759-761)、
hmacHex()(src/lib/crypto.ts:120-124)、
pickWinners()(src/lib/lottery.ts:779-795)。
种子:32 字节随机数
种子是 32 字节随机数的 base64url 编码,报名开始前只公开它的摘要,开奖后才公布原值。
换掉种子会让摘要对不上,所以「事后换种子」一定能被发现。
种子与活动一一对应,接口只下发公开字段。
commit:SHA-256(seed)
报名开始前的「种子承诺」就是
commit = SHA-256(seed);验算的第一步就是对新公布的种子重算一次
SHA-256,和当初公示的承诺逐字比对。
后端 commitOf()(src/lib/lottery.ts:747-749)。
SHA-256 与 HMAC-SHA256 都由浏览器自带的 WebCrypto 计算,页面不加载任何第三方算法库,
接口只提供公开字段(承诺、揭晓值、脱敏名单)。