大家は時々ウェブサイトを閲覧することがあります。閲覧する際にはプライベートウィンドウを開くことがあります。
開いた後はプライベートであると考えられますが、実際にはどうでしょうか。
実際の状況は非常に恐ろしいかもしれません。
それはあなたが誰であるかだけでなく、あなたが何をしたかも知っており、しかもあなたが考えている以上に多くを知っています。
誰かが言うかもしれません、「ただの IP アドレスでしょう?」と、「プロキシを使用すればいいじゃないか」と。
もし私が IP アドレスを使用しなくてもわかると言ったらどうでしょうか。
それでは、どのようにしてそれを実現するのでしょうか。
それは、ブラウザの指紋と呼ばれる技術のおかげです。これは非常に成熟した技術です。
クッキーやログインなしで、正確にユーザーを特定することができます。
実装原理も非常にシンプルです。
世界中にはたくさんのデバイスがありますが、同じデバイス環境を見つけるのは難しいです。
例えば、IP アドレス、ブラウザのバージョン、ブラウザの言語、ブラウザのフォント設定、タイムゾーンなどです。
これらの情報に基づいて、1 つまたは複数のハッシュ値を生成します。これらのハッシュ値はほぼ唯一である可能性が高いです。
完全に重複しないことを保証することはできませんが、一意性は非常に高いです。
例えば、キャンバスを使用してハッシュを生成します。
簡単に書いてみましょう。
function getCanvasFingerprint() {
const canvas = document.createElement('canvas')
canvas.width = 200;
canvas.height = 200
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'rgb(128,0,0)';
ctx.fillRect(10, 10, 100, 100);
ctx.fillStyle = 'rgb(0,128,0)';
ctx.fillRect(50, 50, 100, 100);
ctx.fillStyle = 'rgb(0,128,0)';
ctx.fillRect(30, 30, 80, 80);
ctx.font = '20px Arial';
ctx.fillStyle = 'rgb(0,0,0)';
ctx.fillText('hello', 60, 110);
const dataURL = canvas.toDataURL();
const hash = hashCode(dataURL)
return hash
}
function hashCode(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
const char = str.charCodeAt(i);
hash = (hash << 5) - hash + char;
hash |= 0;
}
return hash
}
const canvasFing = getCanvasFingerprint()
console.log(canvasFing)
通常のブラウジングでは、生成される値は 291669864 です。
プライベートブラウジングでも 291669864 です。
どうすれば異なる値になるのでしょうか。
別のブラウザやデバイスに変えてみてください。
同じキャンバスを描画しても、なぜ生成される値が異なるのでしょうか。
これは、異なるブラウザ、同じブラウザの異なるバージョン、異なるオペレーティングシステム、異なるハードウェアによって、描画エンジンに多かれ少なかれ差異があるためです。同じキャンバスを描画しても、肉眼では気づきにくい差異があり、データに反映されることになります。
これは多くの要素に影響を受けるものであり、ブラウザにプラグインをインストールすることさえ影響を与える可能性があります。ブラウザの設定や操作環境の設定なども含まれます。
これは単なるキャンバスの例ですが、他の生成されたハッシュ値と組み合わせると、単一のプロキシだけでは役に立ちません。
これは主に広告(ショッピング広告など)や不正防止(票の不正投票、再生回数の不正操作など)に使用されますが、根本的にはユーザーを識別するためのものです。したがって、あなたが閲覧しているウェブサイトがあなたを識別したい場合、それは非常に簡単です。
ただし、ブラウザの指紋というものがあります。これにより、同じブラウザ内で異なる指紋を切り替えることができますが、有料です。
実装方法も非常にシンプルで、異なる指紋方法に対応するために、対応する API を変更します。