osamc.de/archiv/audiowmark/index.html

173 lines
8.9 KiB
HTML
Raw Normal View History

2023-12-10 19:09:27 +01:00
<!doctype html>
<html>
<head>
<title>Audiowasserzeichen mit Audiowmark</title>
<link rel="stylesheet" href="normalize.css" type="text/css">
<link rel="stylesheet" href="sakura.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
2023-12-10 19:26:00 +01:00
</head>
2023-12-10 19:09:27 +01:00
<body>
<h1>Audiowmark</h1>
2023-12-10 19:26:00 +01:00
<p>Falls du über eine Suchmaschine hierhergekommen bist: Dieses Dokument dient nur als
Begleitmaterial und Zusammenfassung eines mündlichen Vortrags</p>
2023-12-10 19:09:27 +01:00
<h2>Informationen und Links</h2>
2023-12-10 19:26:00 +01:00
<p>Kommandozeilen-Software von Stefan Westerfeld, entwickelt zum Einbetten von Audio-Wasserzeichen
in die Audiodaten einer Musikdatei. Eine 128-Bit-Nachricht wird fast unhörbar und direkt in der
Wellenform gespeichert und kann auch wieder ausgelesen werden. Zudem besteht die Möglichkeit, sie geheim zu verschlüsseln.
Der Prozess ist unabhängig vom Dateiformat, der Kompression und der Wiedergabeart, also
Datei, Streaming usw. Zum Auslesen der Nachricht ist die Originaldatei nicht erforderlich.</p>
<p>"Ticking all the boxes" für Open-Source-Software: GPL, Verschlüsselungsmethode ist bekannt und
einsehbar, basiert nur auf einem privaten Schlüssel (oder unverschlüsselt).</p>
<p>Hier geht es nur um die praktische Anwendung, nicht um die technischen Hintergründe.</p>
<p>Die Einsatzmöglichkeiten werden weiter unten erläutert, aber vorab der Hauptzweck: primär DRM
und Authentifizierung. Man kann individuelle Informationen (z.B. Kundennummern) in den Audiodaten
selbst speichern, ohne dass sie erkennbar und entfernbar sind, so zumindest das implizite
Versprechen des Autors.</p>
2023-12-10 19:09:27 +01:00
<ul>
2023-12-10 19:26:00 +01:00
<li><a href="https://uplex.de/audiowmark/">Webseite</a></li>
<li><a href="https://uplex.de/audiowmark/README.html">Anleitung</a></li>
<li><a href="https://code.uplex.de/stefan/audiowmark">Quellcode</a></li>
2023-12-10 19:09:27 +01:00
</ul>
<h2>Nicht in diesem Vortrag</h2>
2023-12-10 19:26:00 +01:00
<p>Es gibt auch 'videowmark', ein ähnliches Tool für Videos, das hier jedoch nicht behandelt wird.</p>
2023-12-10 19:09:27 +01:00
2023-12-10 19:26:00 +01:00
<h2>128-Bit-String 32 Zeichen in Hexadezimaler Form</h2>
<p>Woher bekommt man diesen?</p>
2023-12-10 19:09:27 +01:00
2023-12-10 19:26:00 +01:00
<p>Als Hash. Die ersten 128 Bits eines SHA-256-Hashes (Kurze Frage: Wissen alle, was ein Hash ist? Wissen alle, was Hex 0-9A-F bedeutet?)</p>
<pre>
2023-12-10 19:09:27 +01:00
echo -n "OSAMC:BlackStorm:Download312" | sha256sum | head -c 32
b751e47bb131d84e6b67a3348c781d43
2023-12-10 19:26:00 +01:00
# head -c 32, weil es Hex ist: ein Hexwert ist 4 Bit. Also 128 Bit / 4 Bit = 32 Zeichen
# Audiowmark empfiehlt eine Datenbank anzulegen, da man Hashwerte nicht zurückentwickeln kann
2023-12-10 19:09:27 +01:00
</pre>
2023-12-10 19:26:00 +01:00
<p>Oder 16 ASCII-Zeichen in Hexadezimaler Schreibweise:</p>
<pre>
2023-12-10 19:09:27 +01:00
echo -n "osamc:blkstm:312" | xxd -p -u
6F73616D633A626C6B73746D3A333132
2023-12-10 19:26:00 +01:00
# Rückgängig machen: echo -n "6F73616D633A626C6B73746D3A333132" | xxd -p -r
2023-12-10 19:09:27 +01:00
</pre>
2023-12-10 19:26:00 +01:00
<p>ine UUID, die zufälligerweise ebenfalls 128 Bit lang ist.</p>
<pre>
uuidgen | tr -d '-'
# 76fc5abe80f840729375fc4dc15e604d
2023-12-10 19:09:27 +01:00
</pre>
2023-12-10 19:26:00 +01:00
<p>Oder 32 Zeichen, die zufällig alle Hexwerte 0-9A-F sind, aber bereits semantisch lesbar:</p>
<pre>
2023-12-10 19:09:27 +01:00
affe2222fefe1111affe2222fefe1111
</pre>
2023-12-10 19:26:00 +01:00
<p>Um einen ausgelesenen String schnell mit dem eigenen zu vergleichen:</p>
<pre>
[ "affe2222fefe1111affe2222fefe1111" = "affe2222fefe1111affe2222fefe1111" ]; echo $? # Ergebnis 0 bedeutet, dass es der gleiche String ist.
2023-12-10 19:09:27 +01:00
</pre>
2023-12-10 19:26:00 +01:00
<h2>Beispiel 1: Unverschlüsselt in einer WAV-Datei</h2>
2023-12-10 19:09:27 +01:00
2023-12-10 19:26:00 +01:00
<p>Das Hinzufügen und Auslesen eines Wasserzeichens in einer unverschlüsselten WAV-Datei:</p>
<pre>
2023-12-10 19:09:27 +01:00
audiowmark add blackstorm.wav wm-blackstorm.wav b751e47bb131d84e6b67a3348c781d43
audiowmark get blackstorm.wav
2023-12-10 19:26:00 +01:00
# Leer
2023-12-10 19:09:27 +01:00
audiowmark get wm-blackstorm.wav
</pre>
2023-12-10 19:26:00 +01:00
<p>Der Befehl "get" extrahiert die Nachricht aus der Audiodatei. Das Auffinden einer Nachricht,
obwohl keine vorhanden ist (oder eine falsche Nachricht), ist möglich, muss aber zu Ihrer privaten,
geheimen Datenbank passen. Laut den Entwicklern ist dies selten genug, um statistisch
vernachlässigbar zu sein. </p>
2023-12-10 19:09:27 +01:00
<ul>
2023-12-10 19:26:00 +01:00
<li>--detect-speed hilft gegen Konvertierungsfehler (z.B. digital-analog-digital-Kette mit Geschwindigkeitsänderungen). Laut Handbuch kann dies auch beabsichtigt sein, um das Wasserzeichen zu verschleiern.
<li>--detect-speed ist langsam und benötigt mehr RAM, daher ist es nicht die Standardeinstellung. Es unterstützt Multithreading.
<li>--detect-speed-patient ist noch effektiver, erfordert aber höheren Ressourcenverbrauch. Wenn Letzterer keine Rolle spielt, ist dies die bevorzugte Methode.
2023-12-10 19:09:27 +01:00
</ul>
2023-12-10 19:26:00 +01:00
<pre>
2023-12-10 19:09:27 +01:00
audiowmark get --detect-speed-patient wm-blackstorm.wav
</pre>
2023-12-10 19:26:00 +01:00
<p>Es werden mehrere Nachrichten zurückgegeben, als Redundanz gegen Korruption und Kompression. Das dritte Feld ist der "Sync Score", je höher, desto besser. Das vierte Feld ist "Decoding Error", niedriger ist besser. Danach folgt der Blocktyp. Allein A ist in Ordnung, AB ist besser.</p>
2023-12-10 19:09:27 +01:00
2023-12-10 19:26:00 +01:00
<p>Am Ende erscheint ein "All" als Zusammenfassung, die man mit einem anderen Programm verarbeiten kann, z.B. in eine Datenbank einpflegen.</p>
2023-12-10 19:09:27 +01:00
<h2>Beispiel 2: Verschlüsselung</h2>
2023-12-10 19:26:00 +01:00
<p>Um zu verhindern, dass jeder mit Audiowmark die Nachricht auslesen kann bzw. um zu verhindern, dass festgestellt werden kann, ob ein Wasserzeichen vorhanden ist, wird eine interne Verschlüsselungsmethode bereitgestellt. Die Sicherheit dieser Methode wurde nicht überprüft.</p>
<pre>
audiowark gen-key osamc-music-distributor.key # Speichert den Schlüssel in einer Datei
# Schlüssel 88913063e57c946b37bf6ea8ce842d32
2023-12-10 19:09:27 +01:00
audiowmark add --key osamc-music-distributor.key blackstorm.wav wmk-blackstorm.wav b751e47bb131d84e6b67a3348c781d43
2023-12-10 19:26:00 +01:00
audiowark get --detect-speed-patient wmk-blackstorm.wav
# Leer
2023-12-10 19:09:27 +01:00
audiowmark get --detect-speed-patient --key osamc-music-distributor.key wmk-blackstorm.wav
</pre>
<h2>Beispiel 3: Kompression</h2>
2023-12-10 19:26:00 +01:00
<p>Das Wasserzeichen bleibt auch nach der Kompression der Audiodatei erhalten:</p>
<pre>
2023-12-10 19:09:27 +01:00
opusenc wmk-blackstorm.wav wmk-blackstorm.opus
sox wmk-blackstorm.wav wmk-blackstorm.mp3
audiowmark get --detect-speed-patient --key osamc-music-distributor.key wmk-blackstorm.mp3
audiowmark get --detect-speed-patient --key osamc-music-distributor.key wmk-blackstorm.opus
</pre>
<h2>Beispiel 4: Analog als Stream mit Pipes</h2>
2023-12-10 19:26:00 +01:00
<p>"Worst case": Eine verschlüsselte MP3-Version wird über Handy-Lautsprecher abgespielt und mit einem internen Laptopmikrofon aufgenommen.</p>
<p>Eigentlich war geplant, dies mit einem selbstgebauten Stream zu tun, aber es gab Probleme mit den Eingabeoptionen (--input-format raw). Jack_capture sollte funktionieren, aber es gab Probleme mit meinem Pipewire-Setup. Also wurde Audacity verwendet...</p>
2023-12-10 19:09:27 +01:00
2023-12-10 19:26:00 +01:00
<p>Da es sich um eine analoge Übertragung handelt, wird --detect-speed verwendet.</p>
2023-12-10 19:09:27 +01:00
<h2>Weitere Experiment-Ideen</h2>
<ul>
2023-12-10 19:26:00 +01:00
<li>Sehr kurze Lieder, weniger als 10 Sekunden. Eventuell den --short Modus verwenden, siehe README.
<li>Die Musik in einem YouTube-Video einbetten und versuchen, sie daraus wieder herauszuhören. Eventuell den Stream mit einem virtuellen Systemmikrofon (JACK/Pipewire) abhören, um das Audio nicht herunterladen zu müssen.
2023-12-10 19:09:27 +01:00
</ul>
2023-12-10 19:26:00 +01:00
<h2>Die entscheidende Frage</h2>
<p>Ist das Wasserzeichen hörbar bzw. beeinträchtigt es die Audioqualität?</p>
2023-12-10 19:09:27 +01:00
2023-12-10 19:26:00 +01:00
<p>Hier können nur subjektive Eindrücke eine Antwort geben. Die README behauptet, dass die Qualität nicht beeinträchtigt wird, aber das ist nicht sicher. In diesem Beispielstück war zumindest nichts direkt hörbar. Es könnte jedoch sinnvoll sein, dies an einer reinen Sinuswelle zu testen.</p>
2023-12-10 19:09:27 +01:00
2023-12-10 19:26:00 +01:00
<p>Es ist definitiv möglich, die Musikqualität zu verschlechtern. So gibt es z.B. einen --strength-Flag, der mit Werten über 10 (Standard) zu schlechterer Qualität führt. Je höher die "strength", desto robuster gegen Audio-Kompression. 10 reicht für 128 kbit/s MP3. Für das Setzen und Auslesen der Nachricht muss derselbe strength-Wert verwendet werden, dieser sollte also notiert werden.</p>
2023-12-10 19:09:27 +01:00
<h2>Einsatzmöglichkeiten</h2>
2023-12-10 19:26:00 +01:00
<p>Frage ans Publikum: Wofür könnte dies nützlich sein, abgesehen von einem technischen Kuriosum? Gibt es Anforderungen, die nicht besser durch ein explizites paralleles Signal abgedeckt werden könnten (siehe Metadaten und Verkehrsinfo für Autoradios)?</p>
2023-12-10 19:09:27 +01:00
<ul>
2023-12-10 19:26:00 +01:00
<li>Gutartiger DRM: Urheberrechtsnachweis, um sein Copyleft durchzusetzen.</li>
<li>Bösartiger DRM: Musikplayer verweigert das Abspielen, falls die Datei nicht korrekt signiert ist. Anwalt wird automatisch informiert.</li>
<li>Automatisierung: "Ihr Download wird vorbereitet" und dann wird die Kundennummer in die Audiodatei eingebettet.</li>
<li>Novelty: "Limitierte, signierte digitale Auflage mit Seriennummer."</li>
<li>Patreon-Reward: Dein Name in der Musik als Audiowmark!</li>
2023-12-10 19:09:27 +01:00
</ul>
2023-12-10 19:26:00 +01:00
<p>Sollte man es also verwenden oder nicht? Hier sind Pro und Contra...</p>
<p>
2023-12-10 19:09:27 +01:00
Experimente:
2023-12-10 19:26:00 +01:00
<ul>
<li> In ein Video einbetten und auf youtube hochladen. Dann das ganze mit youtube-dl runterladen und schauen.
<li> Über Lautsprecher abspielen und sich das anhören: Raum und/oder Handy-Lautsprecher und Laptop-Mikrofon
</ul>
</p>
</body>
</html>