Canvas fingerprint ใช้ความแตกต่างเล็กน้อยของผลการเรนเดอร์จากคำสั่งวาดเดียวกันบนฮาร์ดแวร์และซอฟต์แวร์ต่างกันมาเป็นตัวระบุ และแทบไม่ถูกใช้เพียงอย่างเดียว แนวทางที่เหมาะสมไม่ใช่ทำให้ค่าต่างกันทุกครั้ง แต่คือทำให้คุณลักษณะภายในสภาพแวดล้อมเดียวกันสอดคล้องกัน
หลักการของ Canvas fingerprint ไม่ซับซ้อน แต่แนวทางรับมือที่พูดต่อ ๆ กันมาหลายอย่างกลับให้ผลตรงข้ามกับสิ่งที่ควรทำ
คำสั่งเดียวกัน แต่เครื่องต่างกันให้ผลต่างกัน
Canvas เป็นส่วนประกอบสำหรับวาดภาพของ HTML5 ที่เปิดให้หน้าเว็บใช้สคริปต์วาดรูปทรงและข้อความได้ คำสั่งวาดเดียวกันอาจเรนเดอร์ออกมาแตกต่างกันเล็กน้อยบนอุปกรณ์ต่าง ๆ เนื่องจากความแตกต่างระดับพื้นฐาน เช่น ระบบปฏิบัติการ เวอร์ชันเบราว์เซอร์ ไลบรารีฟอนต์ และไดรเวอร์กราฟิก ความต่างเหล่านี้แทบมองไม่เห็นด้วยตาเปล่า แต่เมื่อส่งออกเนื้อหา Canvas เป็นข้อมูล ความต่างก็จะกลายเป็นค่าที่นำมาเปรียบเทียบได้
ขั้นตอนโดยคร่าว ๆ คือ หน้าเว็บวาดกราฟิกและข้อความก่อน แล้วใช้ toDataURL() ส่งออกผลลัพธ์เป็นสตริง Base64 จากนั้นสตริงนี้สามารถใช้เป็นตัวระบุได้ อุปกรณ์ต่างกันให้ผลการส่งออกต่างกัน ดังนั้นในหลายกรณีค่าจึงมีลักษณะเฉพาะ การลบ Cookie ไม่มีผลต่อค่านี้ และการล้าง cache ก็เช่นกัน
แทบไม่ถูกใช้เพียงอย่างเดียว
ค่า Canvas เพียงค่าเดียวมีประโยชน์จำกัด และอาจเปลี่ยนเมื่ออัปเกรดเบราว์เซอร์หรืออัปเดตไดรเวอร์กราฟิก ในการใช้งานจริง Canvas มักถูกนำไปรวมกับคุณลักษณะอื่นหลายรายการเพื่อเทียบตรวจสอบกัน:
- ข้อมูลด้านกราฟิก เช่น WebGL รายการฟอนต์ และรุ่นการ์ดจอ
- ข้อมูลสภาพแวดล้อม เช่น UA เขตเวลา ภาษา และความละเอียดหน้าจอ
- ข้อมูลด้านเซสชัน เช่น Cookie พื้นที่จัดเก็บในเครื่อง และทางออกเครือข่าย
เหตุผลที่รวมสัญญาณเหล่านี้เข้าด้วยกันคือเพื่อตรวจสอบความสอดคล้อง แต่ละรายการเมื่อดูแยกกันอาจอยู่ในช่วงปกติ แต่ความขัดแย้งจะเด่นชัดเมื่อดูร่วมกัน เช่น เขตเวลาตั้งไว้เป็นสหรัฐอเมริกา รายการภาษามีแต่ภาษาจีน และค่า Canvas สอดคล้องกับกราฟิกแบบ integrated แต่ UA กลับระบุว่าเป็นอุปกรณ์ระดับสูงรุ่นใหม่ แพลตฟอร์มไม่จำเป็นต้องพิสูจน์ว่าคุณเป็นใคร แค่ตรวจพบว่าชุดคุณลักษณะนี้ดูไม่เหมือนมาจากเครื่องจริงเครื่องเดียวก็เพียงพอ
การปิด Canvas ทำให้ยิ่งโดดเด่น
ปฏิกิริยาแรกของหลายคนคือปิด Canvas แต่ผลลัพธ์อาจตรงกันข้าม
เบราว์เซอร์ของผู้ใช้ทั่วไปแทบทั้งหมดรองรับ Canvas สภาพแวดล้อมที่ไม่รองรับ Canvas อย่างชัดเจนจึงเป็นกลุ่มส่วนน้อยทางสถิติ และเหมือนประกาศว่ามีการปรับแต่งเป็นพิเศษอยู่ อีกทั้งยังมีปัญหาเชิงใช้งานจริง เพราะเว็บไซต์จำนวนมากพึ่งพา Canvas สำหรับการครอปรูปภาพ กราฟ และการเรนเดอร์ CAPTCHA เมื่อปิด Canvas ฟังก์ชันของหน้าอาจเสีย และเพิ่มความผิดปกติขึ้นมาอีกหนึ่งอย่าง
อีกวิธีหนึ่งคือเปลี่ยนไปใช้ชุดค่าสุ่มใหม่ทุกครั้งที่เข้าใช้งาน วิธีนี้ก็มีปัญหาเช่นกัน เพราะ fingerprint ของอุปกรณ์จริงมีความเสถียร สภาพแวดล้อมที่เปลี่ยนทุกครั้งมีรูปแบบพฤติกรรมต่างจากอุปกรณ์ปกติ จึงอาจถูกแยกและทำเครื่องหมายได้ง่ายขึ้น การสุ่มค่าเองก็อาจเป็นสัญญาณที่ตรวจจับได้
แนวทางที่สมเหตุสมผลคือความสอดคล้องภายใน
แทนที่จะทำให้ทุกอย่างต่างกันทุกครั้ง เป้าหมายที่ใกล้เคียงความเป็นจริงกว่าคือทำให้คุณลักษณะต่าง ๆ ภายในสภาพแวดล้อมสอดคล้องกัน และภาพรวมไม่ดูผิดปกติ
ในทางปฏิบัติ คุณลักษณะต่าง ๆ ควรสนับสนุนกัน: เขตเวลา ภาษา และตำแหน่งทางภูมิศาสตร์ของ IP ขาออกควรสอดคล้องกัน อุปกรณ์ที่ UA ระบุและความสามารถด้านกราฟิกที่ Canvas กับ WebGL แสดงออกมาก็ควรอยู่ในระดับเดียวกัน สภาพแวดล้อมของบัญชีเดียวกันควรคงที่ในระยะยาว และไม่ควรเปลี่ยนอย่างชัดเจนเมื่อเข้าใช้งานซ้ำ ไม่ควรพึ่งปลั๊กอินที่เพียงปิดฟังก์ชันใดฟังก์ชันหนึ่ง เพราะมักสร้างคุณลักษณะที่สะดุดตากว่าเดิม หากทำได้ ควรลดการทำงานของสคริปต์จากบุคคลที่สามเพื่อลดพื้นที่ที่สามารถเก็บข้อมูลได้
หากหลายสภาพแวดล้อมต้องแตกต่างจากกัน นั่นเป็นเรื่องที่ environment isolation ควรจัดการ เครื่องมืออย่าง PurpleMark เมื่อแยกสภาพแวดล้อมสำหรับหลายบัญชี มักกำหนดสภาพแวดล้อมคงที่ให้แต่ละบัญชีแทนการทำให้พารามิเตอร์กระโดดแบบสุ่ม เพราะสิ่งที่แพลตฟอร์มสนใจจริง ๆ คือชุดคุณลักษณะเหล่านี้มีความเสถียรและสอดคล้องกันหรือไม่
สรุป
Canvas ใช้ในการติดตามได้เพราะเปลี่ยนความแตกต่างเล็กน้อยของฮาร์ดแวร์และซอฟต์แวร์ให้เป็นสตริงที่เสถียรและเปรียบเทียบได้ การรับมือที่มีประสิทธิภาพไม่ใช่การปิด Canvas หรือทำให้ค่ากระโดดแบบสุ่ม แต่คือทำให้ Canvas สอดคล้องกับคุณลักษณะอื่นในสภาพแวดล้อมเดียวกัน การดูธรรมดาปลอดภัยกว่าการดูผิดแปลก.


