查看: 24|回复: 0

[文章教程] 用 JS 做浏览器指纹(Browser Fingerprint)实现“设备识别”

[复制链接]
xuanxiao 发表于 4 天前 | 显示全部楼层 |阅读模式
原理:浏览器指纹 = 收集一堆“环境特征” → 拼接 → hash

常用特征:

UA(浏览器)
分辨率
时区
语言
CPU核心数
内存
Canvas 指纹 ⭐
WebGL 指纹 ⭐

组合后基本可以“较稳定识别设备”

纯JS版本:
Canvas 指纹
WebGL 指纹
基础信息
SHA-256 生成唯一ID
  1. <script>
  2. async function getFingerprint() {

  3.     function getCanvasFingerprint() {
  4.         try {
  5.             const canvas = document.createElement("canvas");
  6.             const ctx = canvas.getContext("2d");

  7.             ctx.textBaseline = "top";
  8.             ctx.font = "14px Arial";
  9.             ctx.fillText("fingerprint_test_123", 2, 2);

  10.             return canvas.toDataURL();
  11.         } catch (e) {
  12.             return "";
  13.         }
  14.     }

  15.     function getWebGLFingerprint() {
  16.         try {
  17.             const canvas = document.createElement("canvas");
  18.             const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");

  19.             if (!gl) return "";

  20.             const debugInfo = gl.getExtension("WEBGL_debug_renderer_info");
  21.             return debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : "";
  22.         } catch (e) {
  23.             return "";
  24.         }
  25.     }

  26.     function getBasicInfo() {
  27.         return {
  28.             ua: navigator.userAgent,
  29.             lang: navigator.language,
  30.             timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
  31.             screen: screen.width + "x" + screen.height,
  32.             colorDepth: screen.colorDepth,
  33.             cpu: navigator.hardwareConcurrency || "",
  34.             memory: navigator.deviceMemory || ""
  35.         };
  36.     }

  37.     async function sha256(str) {
  38.         const buf = new TextEncoder().encode(str);
  39.         const hash = await crypto.subtle.digest("SHA-256", buf);
  40.         return Array.from(new Uint8Array(hash))
  41.             .map(b => b.toString(16).padStart(2, "0"))
  42.             .join("");
  43.     }

  44.     const basic = getBasicInfo();
  45.     const canvas = getCanvasFingerprint();
  46.     const webgl = getWebGLFingerprint();

  47.     const raw = JSON.stringify({
  48.         basic,
  49.         canvas,
  50.         webgl
  51.     });

  52.     const fp = await sha256(raw);

  53.     return {
  54.         fingerprint: fp,
  55.         raw: raw
  56.     };
  57. }
  58. </script>
复制代码

三、调用示例(你可以直接提交到ASP)
  1. <script>
  2. getFingerprint().then(res => {
  3.     console.log("指纹:", res.fingerprint);

  4.     // 提交到ASP
  5.     fetch("/api/fp_report.asp", {
  6.         method: "POST",
  7.         headers: {
  8.             "Content-Type": "application/x-www-form-urlencoded"
  9.         },
  10.         body: "fp=" + encodeURIComponent(res.fingerprint)
  11.     });
  12. });
  13. </script>
复制代码

最佳结构(建议你这样做)
第一次访问:
生成 fingerprint
生成 cookie device_id

后续访问:
用 device_id 识别
用 fingerprint 校验

升级版:加盐防伪造
  1. const raw = JSON.stringify(data) + "|你的密钥";
复制代码

存本地:
  1. localStorage.setItem("device_id", fp);
复制代码

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表

在线客服

售前咨询
售后咨询
服务热线
023-58418553
微信公众号