{"id":4292,"date":"2026-08-25T11:20:36","date_gmt":"2026-08-25T09:20:36","guid":{"rendered":"https:\/\/www.capri-soft.de\/blog\/?p=4292"},"modified":"2026-08-25T11:20:36","modified_gmt":"2026-08-25T09:20:36","slug":"geraete-identifizieren-ueber-web-audio-api-audio-fingerprint-nutzer-identifizieren-ueber-audiosignal-aliexpress-methode-zur-geraeteidentifikation","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=4292","title":{"rendered":"Ger\u00e4te identifizieren \u00fcber Web Audio API \/ Audio-Fingerprint \/ Nutzer identifizieren \u00fcber Audiosignal \/ AliExpress-Methode zur Ger\u00e4teidentifikation"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Intention<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel zeigt einen Beispielcode um \u00fcber die Web Audio API den Fingerprint eines Ger\u00e4tes zu identifzieren. Bitte beachten Sie, dass die Identifikation <strong>nicht mit den Richtlinien der DSGVO-konform ist<\/strong>, daher sollte sie nur zu lokalen Testzwecken genutzt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Aufmerksamkeit auf diesen Sachverhalt lenkte der folgende Heise-Artikel auf mich, daher entschied ich mich hier n\u00e4her damit zu befassen:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.heise.de\/news\/AliExpress-trackt-Nutzer-via-unhoerbarem-Audio-Fingerprinting-11424127.html\">https:\/\/www.heise.de\/news\/AliExpress-trackt-Nutzer-via-unhoerbarem-Audio-Fingerprinting-11424127.html<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Grundidee: Was wir messen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wir nutzen die Web Audio API, um:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ein synthetisches Signal<\/strong> zu erzeugen (Oszillator),<\/li>\n\n\n\n<li>es durch einen <strong>DynamicsCompressorNode<\/strong> zu schicken,<\/li>\n\n\n\n<li>das Ergebnis in einem <strong>OfflineAudioContext<\/strong> zu rendern,<\/li>\n\n\n\n<li>aus dem fertigen Audiopuffer einen <strong>Zahlwert<\/strong> zu berechnen, der vom Ger\u00e4t abh\u00e4ngt.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Zahlwert ist der <strong>Audio-Fingerprint<\/strong> f\u00fcr das Ger\u00e4t und kann genutzt werden um das Ger\u00e4te eindeutig zu identifizieren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warum das pro Ger\u00e4t anders ist<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Floating\u2011Point\u2011Arithmetik<\/strong> unterscheidet sich je nach CPU\/Instruction\u2011Set.<\/li>\n\n\n\n<li><strong>Browser\u2011Engine<\/strong> (Chromium, Gecko, WebKit) implementiert DSP leicht unterschiedlich.<\/li>\n\n\n\n<li><strong>Audio\u2011Stack des OS<\/strong> kann Einfluss haben, je nach Implementierung.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Ergebnis:<\/strong> derselbe Code \u2192 auf Rechner A ein anderer Wert als auf Rechner B, aber bei Rechner A <strong>stabil<\/strong> \u00fcber viele Aufrufe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Code<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;de&quot;&gt;\n&lt;head&gt;\n  &lt;meta charset=&quot;utf-8&quot; \/&gt;\n  &lt;title&gt;Audio-Fingerprint Test (OfflineAudioContext)&lt;\/title&gt;\n  &lt;style&gt;\n    body { font-family: system-ui, sans-serif; margin: 2rem; }\n    button { padding: 0.5rem 1rem; font-size: 1rem; }\n    #result { margin-top: 1rem; font-family: monospace; }\n  &lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n  &lt;h1&gt;Audio-Fingerprint Test&lt;\/h1&gt;\n  &lt;p&gt;\n    Diese Seite erzeugt einen &lt;strong&gt;OfflineAudioContext&lt;\/strong&gt;, rendert ein festes Signal\n    und berechnet daraus einen Fingerprint-Wert. Es wird &lt;strong&gt;kein Ton abgespielt&lt;\/strong&gt;\n    und &lt;strong&gt;keine Daten \u00fcbertragen&lt;\/strong.\n  &lt;\/p&gt;\n\n  &lt;button id=&quot;run&quot;&gt;Fingerprint berechnen&lt;\/button&gt;\n  &lt;div id=&quot;result&quot;&gt;&lt;\/div&gt;\n\n  &lt;script&gt;\n    async function getAudioFingerprint() {\n      \/\/ 1 Kanal, 5000 Frames, 44100 Hz\n      const sampleRate = 44100;\n      const length = 5000;\n      const offlineCtx = new OfflineAudioContext(1, length, sampleRate);\n\n      \/\/ Oszillator als Testsignal\n      const osc = offlineCtx.createOscillator();\n      osc.type = &#039;triangle&#039;;\n      osc.frequency.value = 10000; \/\/ 10 kHz\n\n      \/\/ DynamicsCompressor verst\u00e4rkt Floating-Point-Unterschiede\n      const comp = offlineCtx.createDynamicsCompressor();\n      comp.threshold.value = -24;\n      comp.knee.value = 30;\n      comp.ratio.value = 12;\n      comp.attack.value = 0.003;\n      comp.release.value = 0.25;\n\n      osc.connect(comp);\n      comp.connect(offlineCtx.destination);\n      osc.start(0);\n\n      \/\/ Offline rendern (kein Audio-Ausgang)\n      const buffer = await offlineCtx.startRendering();\n      const data = buffer.getChannelData(0);\n\n      \/\/ Aus einem festen Bereich eine kompakte Zahl ableiten\n      const start = 4500;\n      const end = 5000;\n      let sum = 0;\n      let hash = 0;\n\n      for (let i = start; i &lt; end; i++) {\n        const v = Math.abs(data&#x5B;i]);\n        sum += v;\n        \/\/ einfache Hash-Mischung\n        hash = (hash * 31 + Math.floor(v * 1e6)) &gt;&gt;&gt; 0;\n      }\n\n      return {\n        rawSum: sum,\n        hash: hash.toString(16).padStart(8, &#039;0&#039;)\n      };\n    }\n\n    document.getElementById(&#039;run&#039;).addEventListener(&#039;click&#039;, async () =&gt; {\n      const resultEl = document.getElementById(&#039;result&#039;);\n      resultEl.textContent = &#039;Berechne...&#039;;\n\n      try {\n        const fp = await getAudioFingerprint();\n        resultEl.innerHTML =\n          &#039;&lt;p&gt;&lt;strong&gt;Roh-Summe:&lt;\/strong&gt; &#039; + fp.rawSum.toFixed(6) + &#039;&lt;\/p&gt;&#039; +\n          &#039;&lt;p&gt;&lt;strong&gt;Hash (hex):&lt;\/strong&gt; &#039; + fp.hash + &#039;&lt;\/p&gt;&#039; +\n          &#039;&lt;p&gt;Auf demselben Ger\u00e4t sollte dieser Wert relativ stabil sein, &#039; +\n          &#039;auf anderen Ger\u00e4ten\/Browsers unterschiedlich.&lt;\/p&gt;&#039;;\n      } catch (e) {\n        resultEl.textContent = &#039;Fehler: &#039; + e;\n      }\n    });\n  &lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n\n<\/pre><\/div><iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D4292&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>Intention Dieser Artikel zeigt einen Beispielcode um \u00fcber die Web Audio API den Fingerprint eines Ger\u00e4tes zu identifzieren. Bitte beachten Sie, dass die Identifikation nicht mit den Richtlinien der DSGVO-konform ist, daher sollte sie nur zu lokalen Testzwecken genutzt werden. Die Aufmerksamkeit auf diesen Sachverhalt lenkte der folgende Heise-Artikel auf mich, daher entschied ich mich &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=4292\" class=\"more-link\"><span class=\"screen-reader-text\">Ger\u00e4te identifizieren \u00fcber Web Audio API \/ Audio-Fingerprint \/ Nutzer identifizieren \u00fcber Audiosignal \/ AliExpress-Methode zur Ger\u00e4teidentifikation<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[14,373,30,3],"tags":[620,614,615,616,617,613,618],"class_list":["post-4292","post","type-post","status-publish","format-standard","hentry","category-htmlcss","category-it-sicherheit-u-cybersecurity","category-javascript","category-programmierung","tag-aliexpress","tag-cybersecurity","tag-dsgvo","tag-html","tag-it-sicherheit","tag-javascript","tag-personenbezogene-daten"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-17e","jetpack_likes_enabled":true,"jetpack-related-posts":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4292"}],"version-history":[{"count":1,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4292\/revisions"}],"predecessor-version":[{"id":4293,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/4292\/revisions\/4293"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4292"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4292"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}