Canvas fingerprint new technique

Moved Support
  • Recently, I've come across an interesting canvas fingerprinting evasion method designed to trick browsers into generating distinct fingerprints by deliberately adding redundant or seemingly "useless" canvas drawing operations. Essentially, the method works by repeatedly resetting the canvas width and redrawing very similar content, adding subtle variations to confuse fingerprinting algorithms.

    Here are two JavaScript code snippets illustrating this approach:

    Snippet 1:

    ;(async function(){
       var canvas = document.createElement("canvas");
       canvas.width = 96;
       canvas.height = 96;
       var context = canvas.getContext('2d', {willReadFrequently: true});
       context.font = "94px sans-serif";
       context.fillStyle = "#000";
       context.fillText("πŸ‘¨β€πŸš€",-1.0,96.0);
       canvas.width = canvas.width;
       canvas.width = canvas.width;
       context.font = "94px sans-serif";
       context.fillStyle = "#000";
       context.fillText("πŸ‘¨β€πŸš€",-1.0,96.0);
       canvas.width = canvas.width;
       canvas.width = canvas.width;
       context.font = "94px sans-serif";
       context.fillStyle = "#000";
       context.fillText("🚡",-1.0,96.0);
       var str = context.getImageData(0,0,96,96).data;
       // Convert pixel data to hex fingerprint...
    })();
    

    Snippet 2 (variation):

    ;(async function(){
       var canvas = document.createElement("canvas");
       canvas.width = 96;
       canvas.height = 96;
       var context = canvas.getContext('2d', {willReadFrequently: true});
       context.font = "94px sans-serif";
       context.fillStyle = "#000";
       context.fillText("πŸ‘¨β€πŸš€",-1.0,96.0);
       canvas.width = canvas.width;
       canvas.width = canvas.width;
       context.font = "94px sans-serif";
       context.fillStyle = "#000";
       context.fillText("πŸ‘¨β€πŸš€",-1.0,96.0);
       canvas.width = canvas.width;
       canvas.width = canvas.width;
       context.font = "94px sans-serif";
       context.fillStyle = "#000";
       context.fillText("🚡",-1.0,96.0);
       canvas.width = canvas.width;
       canvas.width = canvas.width;
       context.font = "94px sans-serif";
       context.fillStyle = "#000";
       context.fillText("πŸš΅β€",-1.0,96.0); // subtle addition
       var str = context.getImageData(0,0,96,96).data;
       // Convert pixel data to hex fingerprint...
    })();
    

    This technique leverages small differences in the final canvas renderingβ€”particularly using emojis and invisible Unicode modificationsβ€”to create distinct fingerprints, effectively confusing fingerprint trackers. By repeatedly clearing the canvas (e.g., canvas.width = canvas.width), browsers often register each redrawing as a different canvas output, thus complicating attempts at reliably fingerprinting.

    So with Perfect Canvas, we only get precomputed canvas request, then how are you gonna deal with this ?

  • ModeratorM Moderator moved this topic from Feedback on
  • @lowkeypal ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ страницы, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ такая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°?

  • https://new88bi.com/
    here's an example, you'd need to do some actions like register ... to trigger more canvas requesting but same code like I said above.
    I can't redo the canvas inspector flow for now, but you can check easily

  • @lowkeypal Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π·Π½Π°Π΅Ρ‚ ΠΎΠ± этом.

  • @FastSpace do you mean they knows but they don't do anything?

  • @lowkeypal said in Canvas fingerprint new technique:

    So with Perfect Canvas, we only get precomputed canvas request, then how are you gonna deal with this ?

    Well, we have a very different way to make it work.You could just not hide your real video card. But that's not the only option - just the easiest one, I think

  • @sergerdn can you help me know more about this approach?

  • @lowkeypal said in Canvas fingerprint new technique:

    @sergerdn can you help me know more about this approach?

    I clearly wrote what you need to make this work. What exactly do you need more info on? How can it be done in BAS?

  • @sergerdn yes, how can it be done in BAS?

  • @lowkeypal said in Canvas fingerprint new technique:

    @sergerdn yes, how can it be done in BAS?

    If you are a premium user, you may contact support. However, since the version 28.7.1, that feature has been removed by the developer of the BAS for some unknown reason.

    https://community.bablosoft.com/topic/30888/ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅-28-7-1/8?_=1748959031537

  • @lowkeypal Π― Π½Π΅ провСрял ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° сайтС. ΠŸΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡ‚Π΅, Π’Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ сайт послС вычислСний hex canvas ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ подставляСтС? Или ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Canvas Inspector ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ лишниС canvas?

  • @ΠœΠΈΡ…Π°ΠΈΠ»96 I checked and found that it request a new canvas but with different code, so the Fingerprint Switcher (or Perfect Canvas) identified it as a different canvas request which not precomputed in the fingerprint, then it output different hex (with or without noise added I'm not sure) when It should be the same hex with previous canvas request. .
    I think you understand the point here

  • @lowkeypal Π― ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Вас понял, Ρ‡Ρ‚ΠΎ Π²Ρ‹ нашли Π½Π° самом сайтС https://new88bi.com/ мСсто Π² обфусцированном ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ сайт ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ отрисовки ΠΈ этот Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ подмСняСтся, сайт ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с ΡˆΡƒΠΌΠΎΠΌ ΠΈΠ»ΠΈ с устройства, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ BAS?