Discord/Twitch/Kick/Snapchat 年龄验证器
本文介绍了如何使用 K-ID 在 Discord、Twitch、Kick 和 Snapchat 等平台上自动验证您的年龄。该工具由 xyzeva 和 Dziurwa 制作。
如何在 Discord 上进行验证
无论您身处英国等目前已开放此功能的地区,还是其他地区,此方法都可以验证您的帐户,以应对未来的全球推广以及当前的要求。
要使用此功能,只需将以下脚本粘贴到您的 Discord控制台中即可。
- 访问 discord.com/app
- 按
F12打开开发者工具。 - 切换到 Console(控制台)选项卡。
- 复制并粘贴下面的脚本,然后按
Enter键。 - 如果提示,请输入 “allow pasting” 以启用控制台输入。
- 完成弹出的验证码。
// add a chunk to extract webpack's moduleCache
let webpackRequire = webpackChunkdiscord_app.push([[Symbol()],{},(r) => r]);
// cleanup the chunk we added
webpackChunkdiscord_app.pop();
let modules = webpackRequire.m;
let cache = webpackRequire.c;
// https://github.com/moonlight-mod/moonlight/blob/main/packages/core-extensions/src/spacepack/webpackModules/spacepack.ts
// helper to find a webpack module via code snippet
function findByCode(src) {
for (const [id, mod] of Object.entries(modules)) {
if (mod.toString().includes(src)) {
return cache[id].exports;
}
}
}
// helper to find an object by its key
function findObjectFromKey(exports, key) {
if (!exports) return;
for (const exportKey in exports) {
const obj = exports[exportKey];
if (obj && obj[key]) return obj;
}
}
// https://github.com/moonlight-mod/moonlight/blob/main/packages/mappings/src/mappings/discord/utils/HTTPUtils.ts
// find the discord api client
const api = findObjectFromKey(
findByCode('.set("X-Audit-Log-Reason",'),
"patch",
);
// send a api request to discord /age-verification/verify and then redirect the page to our website
const request = await api.post({
url: "/age-verification/verify",
body: { method: 3 },
});
const verificationUrl = request.body.verification_webview_url;
window.location.href = `https://age-verifier.kibty.town/webview?url=${encodeURIComponent(
verificationUrl,
)}`;
(随意查看代码;它是可读且透明的。)
它应该会导航到一个链接(或给您一个导航链接)。从那里,只需等待页面显示 “success”(成功)。
恭喜!您的 Discord 帐户现已通过年龄验证。
如何在其他平台上进行验证(Twitch, Kick, Snapchat 等)
- 访问 年龄验证页面。
- 选择 “Selfie”(自拍)。
- 获取二维码的 URL。
- 将其放入页面上的输入框中。
- 点击 “Verify”(验证)。
工作原理
Discord 使用的年龄验证提供商 K-ID 不会将您的面部信息存储或发送到服务器。相反,它发送关于您面部的元数据和一般流程细节。虽然这有利于隐私(相比于发送实际视频的提供商),但也造成了一个漏洞:我们可以向他们的服务器发送看起来合法的元数据,而他们无法区分真伪。
以前这很容易。然而,在 amplitudes k-id verifier 发布后(该工具已失效),K-ID 的面部验证合作伙伴 (FaceAssure) 使这变得更加困难。随着 Discord 决定将年龄验证作为全球性要求,作者们再次研究了如何绕过新的检查。
第一步:加密负载 (Encrypted Payload) 和认证标签 (Auth Tag)
旧的实现在比较合法请求和生成的请求时,没有在正文中发送 encrypted_payload、auth_tag、timestamp 和 iv。
查看代码,这似乎是一个简单的 AES-GCM 加密,密钥是 nonce + timestamp + transaction_id,使用 HKDF (SHA256) 派生。该工具复制了这一点来创建缺失的参数:
encrypted_payloadauth_tagtimestampiv
第二步:预测数据 (Prediction Data)
即使在完美复制加密后,验证尝试仍然失败,这意味着还在对实际负载进行检查。经过一番尝试和错误,检查的部分被缩小到预测数组:outputs、primaryOutputs 和 raws。
outputs 和 primaryOutputs 都是从 raws 生成的。原始数字被映射到年龄输出,然后使用 Z-score 去除异常值(primaryOutputs 去除一次,outputs 去除两次)。
还有其他一些差异:
- 预测中的
xScaledShiftAmt和yScaledShiftAmt不是随机的,而是两个值中的一个。 - 媒体名称(摄像头)必须与设备数组中的一个媒体设备匹配。
- 状态完成时间必须与状态时间线匹配。
完成所有这些后,该工具就可以正式验证成年人年龄。
所有这些代码都是开源的,可以在 GitHub 上找到,所以您可以确切地看到它是如何工作的。