马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
首先跟大家说声对不起,担任管理后期这段时间因工作原因很少在群内与各位朋友交流,该贴也为本人在论坛的处女贴。
关于浏览器唯一指纹的问题还是要有了解网站是怎么认识你是你他是他的,其实这个和电脑硬件生产制造都是有关系的,咱们就从可见的"<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()
以上就是大多数网站画布指纹的获取方式,其他指纹也大概就是这个意思,所以设置出一个高质量的唯一浏览器指纹不是说随便照搬个数据就成功了,还是需要配合自己分析一下或者不会分析的话就多尝试搞个最优的值
|