0

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

我想允许大量的人进入一个系统,比如说 500k 人,我想生成一个邀请码以通过电子邮件或蜗牛邮件发送。我不想生成一堆代码来存储在表中进行比较,所以代码需要看起来是随机的,但实际上具有相同的校验和。

有没有可以重新排序字符串的 jQuery 插件,所以我可以这样做?


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

4

1 回答 1

1

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

您将要使用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)。

于 2019-11-01T21:03:06.030 回答