使用校验和生成邀请代码

时间:2013-07-06 12:17:14

标签: javascript jquery encryption checksum

我正在寻找一个基本的邀请码认证系统,它可以生成一个32位的校验和,但每次都会被洗牌。

我想让一大群人进入一个系统,让我们说500k人,我想生成一个邀请代码,通过电子邮件或蜗牛邮件发送。我不想生成一堆代码存储在表中进行比较,因此代码需要显示为随机但实际上具有相同的校验和。

是否有一个jQuery插件可以重新排序字符串,所以我可以这样做?


生成代码>例如123456(但随机顺序) 注册>输入代码> 123456:1 + 2 + 3 + 4 + 5 + 6 = 16?

1 个答案:

答案 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)。