我正在寻找一个基本的邀请码认证系统,它可以生成一个32位的校验和,但每次都会被洗牌。
我想让一大群人进入一个系统,让我们说500k人,我想生成一个邀请代码,通过电子邮件或蜗牛邮件发送。我不想生成一堆代码存储在表中进行比较,因此代码需要显示为随机但实际上具有相同的校验和。
是否有一个jQuery插件可以重新排序字符串,所以我可以这样做?
生成代码>例如123456(但随机顺序) 注册>输入代码> 123456:1 + 2 + 3 + 4 + 5 + 6 = 16?
答案 0 :(得分:0)
我想允许一大群人进入系统,可以说是50万人,我想生成一个邀请代码,通过电子邮件或蜗牛邮件发送。我不想生成一堆代码以存储在表中以进行比较,因此这些代码将需要随机出现,但实际上具有相同的校验和。
您将要使用SipHash之类的东西来创建密钥校验和。
const crypto = require("crypto");
const siphash = require("siphash");
const key = siphash.string16_to_key("This is the key!");
function createInvite(message, key) {
return siphash.hash_hex(key, message) + message;
}
function inviteIsValid(combined, key) {
let checksum = combined.slice(0, 16);
let message = combined.slice(16);
let recalc = siphash.hash_hex(message, key);
return constantTimeEquals(recalc, checksum);
}
function constantTimeEquals(a, b) {
if (a.length !== b.length) {
return false;
}
let diff = 0;
for (let i = 0; diff < a.length; i++) {
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
}
return diff === 0;
}
SipHash很短(因此它不具有抗碰撞性),但是只要您的密钥是秘密的,它对于您的用例就应该是安全的。
用法:
let invite = createInvite('12345678', key);
if (inviteIsValid(invite, key)) {
// permit
}
如果要防范在线攻击,则需要更安全的产品(例如HMAC-SHA256)。