在Chrome上的画布指纹识别

rgb*_*wed 12 html5 google-chrome canvas

我一直在尝试使用Canvas Fingerprinting为我的数据库提供另一层用户识别......这是一个我知道有经验的黑客可以解决的层,因为指纹是在客户端创建的,但是,嘿,安全层越多越好, 对?

不幸的是,我测试Google Chrome指纹的每台Windows 7计算机都会产生相同的指纹.例如,转到这个jsfiddle:http://jsfiddle.net/af1pL6fb/5/我使用的所有Win7/Chrome机器都产生了503251348的散列.如果这么多不同的用户得到相同的散列,指纹没用.

我试图在画布上绘制各种随机的东西,让每台计算机产生一个稍微不同的结果 - 就像理论一样 - 但是我尝试的每一个Chrome浏览器都会给出相同的结果.

任何人都知道为什么当其他计算机的其他相同浏览器给我不同的结果时(正如预期的那样)Chrome的行为是这样的?

或者任何人都知道我可以在画布中包含哪些东西以鼓励不同的结果?

或者任何人都知道我可以使用不同的指标来区分计算机?例如,我正在将navigator.mimeType数组视为为特定浏览器提供半唯一指示符的潜在方法.

这是我的指纹功能:

function fingerprint() {
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    var txt = 'i9asdm..$#po((^@KbXrww!~cz';
    ctx.textBaseline = "top";
    ctx.font = "16px 'Arial'";
    ctx.textBaseline = "alphabetic";
    ctx.rotate(.05);
    ctx.fillStyle = "#f60";
    ctx.fillRect(125,1,62,20);
    ctx.fillStyle = "#069";
    ctx.fillText(txt, 2, 15);
    ctx.fillStyle = "rgba(102, 200, 0, 0.7)";
    ctx.fillText(txt, 4, 17);
    ctx.shadowBlur=10;
    ctx.shadowColor="blue";
    ctx.fillRect(-20,10,234,5);
    var strng=canvas.toDataURL();

    var hash=0;
    if (strng.length==0) return;
    for (i = 0; i < strng.length; i++) {
        char = strng.charCodeAt(i);
        hash = ((hash<<5)-hash)+char;
        hash = hash & hash;
    }
    return hash;
}
Run Code Online (Sandbox Code Playgroud)

Pio*_*ula 7

有一个名为fingerprint.js的库似乎工作得很好.

  • 它将获得非HTML 5客户端的指纹
  • 启用画布将在可用时提高准确性
  • 如果启用,它可以根据浏览器上安装的插件创建更独特的指纹(虽然不确定为什么需要它)

我在我的网站上嵌入了这个脚本,你可以在这里进行指纹测试.它在同一浏览器上以隐身模式运行,Chrome在其他计算机上以不同方式进行指纹识别.

我将尝试使用业务逻辑来尝试将指纹链接到同一个人.显然,在像我这样的死亡地点很难要求很少,但值得一试.


您可以尝试在本网站描述的 PNG上使用32位CRC .atobIE <= 9不支持.

var b64 = canvas.toDataURL.replace("data:image/png;base64,","");
var bin = atob(b64);

// crc32 takes only 4 bytes and placed from 16 to 12 byte from the end of file
var crc = bin2hex(bin.slice(-16,-12));
Run Code Online (Sandbox Code Playgroud)

我的签名是基于该方法的FE72FC19.