FBrowserCEF3Lib浏览器开发技术交流网址

 找回密码
 立即注册
查看: 1220|回复: 5

关于浏览器指纹知识普及,让你在规避广告追踪的道路上一路小跑瑶瑶领先

  [复制链接]

签到天数: 37 天

[LV.5]常住居民I

3

主题

30

回帖

927

积分

管理员

皇冠皇冠皇冠皇冠太阳太阳

积分
927

永久VIP会员活跃会员热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2025-7-29 13:56:02 | 显示全部楼层 |阅读模式
文档教程
教程类型: 通用教程
备注说明: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
首先跟大家说声对不起,担任管理后期这段时间因工作原因很少在群内与各位朋友交流,该贴也为本人在论坛的处女贴。

关于浏览器唯一指纹的问题还是要有了解网站是怎么认识你是你他是他的,其实这个和电脑硬件生产制造都是有关系的,咱们就从可见的"<canvas></canvas>HTML标签"画布指纹来举例说明,同一批次生产的显卡核芯等芯片晶圆以亿为单位的话里面肯定是有完美和带瑕疵的成员各不相同,这样就会导致咱们在绘图和渲染上面有细微差别,这个差别小到你肉眼不可见,然后还和浏览器内核版本这些都有关系,当然也会出现完全克隆性的产品这个几率可能100年难遇一回,所以就有浏览器指纹唯一说,那么废话不多说了直接上图和代码。

已下例子源码来自大家熟悉的指纹检测网站"gongjux.com/fingerprint/",代码没有混淆更好作为例子讲解就改了一下他获取画布指纹的代码。

第一张图在你使用FBrowserCEF3Lib指纹浏览器框架未设置画布指纹时画出来的图片如下。

关于浏览器指纹知识普及,让你在规避广告追踪的道路上一路小跑瑶瑶领先

关于浏览器指纹知识普及,让你在规避广告追踪的道路上一路小跑瑶瑶领先

第二张图在你使用了FBrowserCEF3Lib指纹浏览器框架设置了画布指纹时画出来的图片如下。

关于浏览器指纹知识普及,让你在规避广告追踪的道路上一路小跑瑶瑶领先

关于浏览器指纹知识普及,让你在规避广告追踪的道路上一路小跑瑶瑶领先



获取上面图片BASE64编码原JS代码如下,这个设置指纹前后你只要拿到2张图打开就会发下现在2张图是有区别的,如果看不出来放大图片然后豪放一点睁大一点您那镶金边的眼睛就看出来了,画布指纹噪点就完美出现在第二张图上面,有的网站会检测颜色值的差别数量,所以画布指纹不是越多越好,最好是对应网站有差别的设置。
[JavaScript] 查看源码 复制代码
function get_canvasBASE64() {
                e = {};
                var t = {}
                  , n = document.createElement("canvas");
                n.width = 2e3,
                n.height = 200,
                n.style.display = "inline";
                var a = n.getContext("2d");
                t.canvasWinding = !1 === a.isPointInPath(5, 5, "evenodd") ? "yes" : "no",
                a.fillStyle = "#f60",
                a.fillRect(125, 1, 62, 20),
                a.fillStyle = "#069",
                e.dontUseFakeFontInCanvas ? a.font = "11pt Arial" : a.font = "11pt no-real-font-123",
                a.fillText("Cwm fjordbank glyphs vext quiz, 😃", 2, 15),
                a.fillStyle = "rgba(102, 204, 0, 0.2)",
                a.font = "18pt Arial",
                a.fillText("Cwm fjordbank glyphs vext quiz, 😃", 4, 45),
                a.globalCompositeOperation = "multiply",
                a.fillStyle = "rgb(255,0,255)",
                a.beginPath(),
                a.arc(50, 50, 50, 0, 2 * Math.PI, !0),
                a.closePath(),
                a.fill(),
                a.fillStyle = "rgb(0,255,255)",
                a.beginPath(),
                a.arc(100, 50, 50, 0, 2 * Math.PI, !0),
                a.closePath(),
                a.fill(),
                a.fillStyle = "rgb(255,255,0)",
                a.beginPath(),
                a.arc(75, 100, 50, 0, 2 * Math.PI, !0),
                a.closePath(),
                a.fill(),
                a.fillStyle = "rgb(255,0,255)",
                a.arc(75, 75, 75, 0, 2 * Math.PI, !0),
                a.arc(75, 75, 25, 0, 2 * Math.PI, !0),
                a.fill("evenodd");
               return n.toDataURL()
                
            }
            get_canvasBASE64()

他首先是画一张图片然后拿图片的BASE64编码取MD5的值获取的就是画布指纹的唯一值原JS代码如下。
[JavaScript] 查看源码 复制代码
function r(e, t) {
                var n = (65535 & e) + (65535 & t);
                return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
            }
            function o(e, t, n, a, i, o) {
                return r((l = r(r(t, e), r(a, o))) << (c = i) | l >>> 32 - c, n);
                var l, c
            }
            function l(e, t, n, a, i, r, l) {
                return o(t & n | ~t & a, e, t, i, r, l)
            }
            function c(e, t, n, a, i, r, l) {
                return o(t & a | n & ~a, e, t, i, r, l)
            }
            function s(e, t, n, a, i, r, l) {
                return o(t ^ n ^ a, e, t, i, r, l)
            }
            function u(e, t, n, a, i, r, l) {
                return o(n ^ (t | ~a), e, t, i, r, l)
            }
            function d(e, t) {
                var n, a, i, o, d;
                e[t >> 5] |= 128 << t % 32,
                e[14 + (t + 64 >>> 9 << 4)] = t;
                var g = 1732584193
                  , h = -271733879
                  , m = -1732584194
                  , f = 271733878;
                for (n = 0; n < e.length; n += 16)
                    a = g,
                    i = h,
                    o = m,
                    d = f,
                    g = l(g, h, m, f, e[n], 7, -680876936),
                    f = l(f, g, h, m, e[n + 1], 12, -389564586),
                    m = l(m, f, g, h, e[n + 2], 17, 606105819),
                    h = l(h, m, f, g, e[n + 3], 22, -1044525330),
                    g = l(g, h, m, f, e[n + 4], 7, -176418897),
                    f = l(f, g, h, m, e[n + 5], 12, 1200080426),
                    m = l(m, f, g, h, e[n + 6], 17, -1473231341),
                    h = l(h, m, f, g, e[n + 7], 22, -45705983),
                    g = l(g, h, m, f, e[n + 8], 7, 1770035416),
                    f = l(f, g, h, m, e[n + 9], 12, -1958414417),
                    m = l(m, f, g, h, e[n + 10], 17, -42063),
                    h = l(h, m, f, g, e[n + 11], 22, -1990404162),
                    g = l(g, h, m, f, e[n + 12], 7, 1804603682),
                    f = l(f, g, h, m, e[n + 13], 12, -40341101),
                    m = l(m, f, g, h, e[n + 14], 17, -1502002290),
                    g = c(g, h = l(h, m, f, g, e[n + 15], 22, 1236535329), m, f, e[n + 1], 5, -165796510),
                    f = c(f, g, h, m, e[n + 6], 9, -1069501632),
                    m = c(m, f, g, h, e[n + 11], 14, 643717713),
                    h = c(h, m, f, g, e[n], 20, -373897302),
                    g = c(g, h, m, f, e[n + 5], 5, -701558691),
                    f = c(f, g, h, m, e[n + 10], 9, 38016083),
                    m = c(m, f, g, h, e[n + 15], 14, -660478335),
                    h = c(h, m, f, g, e[n + 4], 20, -405537848),
                    g = c(g, h, m, f, e[n + 9], 5, 568446438),
                    f = c(f, g, h, m, e[n + 14], 9, -1019803690),
                    m = c(m, f, g, h, e[n + 3], 14, -187363961),
                    h = c(h, m, f, g, e[n + 8], 20, 1163531501),
                    g = c(g, h, m, f, e[n + 13], 5, -1444681467),
                    f = c(f, g, h, m, e[n + 2], 9, -51403784),
                    m = c(m, f, g, h, e[n + 7], 14, 1735328473),
                    g = s(g, h = c(h, m, f, g, e[n + 12], 20, -1926607734), m, f, e[n + 5], 4, -378558),
                    f = s(f, g, h, m, e[n + 8], 11, -2022574463),
                    m = s(m, f, g, h, e[n + 11], 16, 1839030562),
                    h = s(h, m, f, g, e[n + 14], 23, -35309556),
                    g = s(g, h, m, f, e[n + 1], 4, -1530992060),
                    f = s(f, g, h, m, e[n + 4], 11, 1272893353),
                    m = s(m, f, g, h, e[n + 7], 16, -155497632),
                    h = s(h, m, f, g, e[n + 10], 23, -1094730640),
                    g = s(g, h, m, f, e[n + 13], 4, 681279174),
                    f = s(f, g, h, m, e[n], 11, -358537222),
                    m = s(m, f, g, h, e[n + 3], 16, -722521979),
                    h = s(h, m, f, g, e[n + 6], 23, 76029189),
                    g = s(g, h, m, f, e[n + 9], 4, -640364487),
                    f = s(f, g, h, m, e[n + 12], 11, -421815835),
                    m = s(m, f, g, h, e[n + 15], 16, 530742520),
                    g = u(g, h = s(h, m, f, g, e[n + 2], 23, -995338651), m, f, e[n], 6, -198630844),
                    f = u(f, g, h, m, e[n + 7], 10, 1126891415),
                    m = u(m, f, g, h, e[n + 14], 15, -1416354905),
                    h = u(h, m, f, g, e[n + 5], 21, -57434055),
                    g = u(g, h, m, f, e[n + 12], 6, 1700485571),
                    f = u(f, g, h, m, e[n + 3], 10, -1894986606),
                    m = u(m, f, g, h, e[n + 10], 15, -1051523),
                    h = u(h, m, f, g, e[n + 1], 21, -2054922799),
                    g = u(g, h, m, f, e[n + 8], 6, 1873313359),
                    f = u(f, g, h, m, e[n + 15], 10, -30611744),
                    m = u(m, f, g, h, e[n + 6], 15, -1560198380),
                    h = u(h, m, f, g, e[n + 13], 21, 1309151649),
                    g = u(g, h, m, f, e[n + 4], 6, -145523070),
                    f = u(f, g, h, m, e[n + 11], 10, -1120210379),
                    m = u(m, f, g, h, e[n + 2], 15, 718787259),
                    h = u(h, m, f, g, e[n + 9], 21, -343485551),
                    g = r(g, a),
                    h = r(h, i),
                    m = r(m, o),
                    f = r(f, d);
                return [g, h, m, f]
            }
            function g(e) {
                var t, n = "", a = 32 * e.length;
                for (t = 0; t < a; t += 8)
                    n += String.fromCharCode(e[t >> 5] >>> t % 32 & 255);
                return n
            }
            function h(e) {
                var t, n = [];
                for (n[(e.length >> 2) - 1] = void 0,
                t = 0; t < n.length; t += 1)
                    n[t] = 0;
                var a = 8 * e.length;
                for (t = 0; t < a; t += 8)
                    n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
                return n
            }
            function m(e) {
                var t, n, a = "";
                for (n = 0; n < e.length; n += 1)
                    t = e.charCodeAt(n),
                    a += "0123456789abcdef".charAt(t >>> 4 & 15) + "0123456789abcdef".charAt(15 & t);
                return a
            }
            function f(e) {
                return unescape(encodeURIComponent(e))
            }
            function S(e) {
                return function(e) {
                    return g(d(h(e), 8 * e.length))
                }(f(e))
            }
            function p(e, t) {
                return function(e, t) {
                    var n, a, i = h(e), r = [], o = [];
                    for (r[15] = o[15] = void 0,
                    i.length > 16 && (i = d(i, 8 * e.length)),
                    n = 0; n < 16; n += 1)
                        r[n] = 909522486 ^ i[n],
                        o[n] = 1549556828 ^ i[n];
                    return a = d(r.concat(h(t)), 512 + 8 * t.length),
                    g(d(o.concat(a), 640))
                }(f(e), f(t))
            }
            function v(e, t, n) {
                return t ? n ? p(t, e) : m(p(t, e)) : n ? S(e) : m(S(e))
            }


function get_canvasMD5(e) {
                e = e || {};
                var t = {}
                  , n = document.createElement("canvas");
                n.width = 2e3,
                n.height = 200,
                n.style.display = "inline";
                var a = n.getContext("2d");
                t.canvasWinding = !1 === a.isPointInPath(5, 5, "evenodd") ? "yes" : "no",
                a.fillStyle = "#f60",
                a.fillRect(125, 1, 62, 20),
                a.fillStyle = "#069",
                e.dontUseFakeFontInCanvas ? a.font = "11pt Arial" : a.font = "11pt no-real-font-123",
                a.fillText("Cwm fjordbank glyphs vext quiz, 😃", 2, 15),
                a.fillStyle = "rgba(102, 204, 0, 0.2)",
                a.font = "18pt Arial",
                a.fillText("Cwm fjordbank glyphs vext quiz, 😃", 4, 45),
                a.globalCompositeOperation = "multiply",
                a.fillStyle = "rgb(255,0,255)",
                a.beginPath(),
                a.arc(50, 50, 50, 0, 2 * Math.PI, !0),
                a.closePath(),
                a.fill(),
                a.fillStyle = "rgb(0,255,255)",
                a.beginPath(),
                a.arc(100, 50, 50, 0, 2 * Math.PI, !0),
                a.closePath(),
                a.fill(),
                a.fillStyle = "rgb(255,255,0)",
                a.beginPath(),
                a.arc(75, 100, 50, 0, 2 * Math.PI, !0),
                a.closePath(),
                a.fill(),
                a.fillStyle = "rgb(255,0,255)",
                a.arc(75, 75, 75, 0, 2 * Math.PI, !0),
                a.arc(75, 75, 25, 0, 2 * Math.PI, !0),
                a.fill("evenodd");
               return v(n.toDataURL())
                
            }
            get_canvasMD5()

以上就是大多数网站画布指纹的获取方式,其他指纹也大概就是这个意思,所以设置出一个高质量的唯一浏览器指纹不是说随便照搬个数据就成功了,还是需要配合自己分析一下或者不会分析的话就多尝试搞个最优的值

评分

参与人数 1金钱 +10 贡献 +10 收起 理由
mosheng + 10 + 10 很给力!

查看全部评分

签到天数: 37 天

[LV.5]常住居民I

3

主题

30

回帖

927

积分

管理员

皇冠皇冠皇冠皇冠太阳太阳

积分
927

永久VIP会员活跃会员热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
 楼主| 发表于 2025-7-29 19:28:55 | 显示全部楼层
zmkl520 发表于 2025-7-29 18:10
看着有点懵

他首先是画一张图片

你这理解能力无语了,不知道是没看清还是自己脑补的流程

签到天数: 3 天

[LV.2]偶尔看看I

0

主题

6

回帖

53

积分

初级会员LV1

月亮月亮

积分
53
发表于 2025-7-29 18:10:42 | 显示全部楼层
本帖最后由 zmkl520 于 2025-7-29 18:15 编辑

看着有点懵

他首先是画一张图片


他是通过浏览器画一张图片,然后他又在自己服务画一张,做对比?
他通过浏览器画一张图片,根据获取你的硬件参数做对比吗? 如果是这样,修改的其它指纹参数那应该就是独一无二的了

点评

你这理解能力无语了,不知道是没看清还是自己脑补的流程  详情 回复 发表于 2025-7-29 19:28

签到天数: 695 天

[LV.9]以坛为家II

294

主题

606

回帖

1万

积分

超级版主

皇冠皇冠皇冠太阳

积分
17933

活跃会员热心会员永久VIP会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2025-7-29 15:52:56 | 显示全部楼层

多发一些这种高质量的贴,我们都喜欢

签到天数: 37 天

[LV.5]常住居民I

3

主题

30

回帖

927

积分

管理员

皇冠皇冠皇冠皇冠太阳太阳

积分
927

永久VIP会员活跃会员热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
 楼主| 发表于 2025-7-29 14:00:42 | 显示全部楼层
mosheng 发表于 2025-7-29 13:58
66666666 学习到了

献丑了

点评

多发一些这种高质量的贴,我们都喜欢  详情 回复 发表于 2025-7-29 15:52

签到天数: 695 天

[LV.9]以坛为家II

294

主题

606

回帖

1万

积分

超级版主

皇冠皇冠皇冠太阳

积分
17933

活跃会员热心会员永久VIP会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2025-7-29 13:58:56 | 显示全部楼层
66666666 学习到了

点评

献丑了  详情 回复 发表于 2025-7-29 14:00
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们 在线手册 视频教程 赞助支持 CEF官网 易语言官网 火山开发官网
拒绝任何人以任何形式在本网站发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表本网站立场!

网址帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!

Archiver| 手机版| 小黑屋| 联系QQ:283987887 劰载中...

Powered by Discuz! X5.0 GMT+8, 2026-9-17 07:00 , Processed in 0.042251 second(s), 22 queries , Redis On.

 川公网安备51090302000262 蜀ICP备2023034329号
快速回复 返回顶部 返回列表