我正在寻找一个基本的邀请码身份验证系统,它会生成一个 32 位校验和,但每次都会被洗牌。
我想允许大量的人进入一个系统,比如说 500k 人,我想生成一个邀请码以通过电子邮件或蜗牛邮件发送。我不想生成一堆代码来存储在表中进行比较,所以代码需要看起来是随机的,但实际上具有相同的校验和。
有没有可以重新排序字符串的 jQuery 插件,所以我可以这样做?
生成代码 > 例如 123456(但随机顺序) 注册 > 输入代码 > 123456 :1+2+3+4+5+6 = 16?
我正在寻找一个基本的邀请码身份验证系统,它会生成一个 32 位校验和,但每次都会被洗牌。
我想允许大量的人进入一个系统,比如说 500k 人,我想生成一个邀请码以通过电子邮件或蜗牛邮件发送。我不想生成一堆代码来存储在表中进行比较,所以代码需要看起来是随机的,但实际上具有相同的校验和。
有没有可以重新排序字符串的 jQuery 插件,所以我可以这样做?
生成代码 > 例如 123456(但随机顺序) 注册 > 输入代码 > 123456 :1+2+3+4+5+6 = 16?
我想允许大量的人进入一个系统,比如说 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)。