Das folgende perl
Skript verwendet entweder den Digest::MD5
oder Digest::SHA
Modul, um eine MAC-Adresse mit einem geheimen Salt in einen Hash umzuwandeln. Siehe die Manpages der Module für weitere Details zu ihnen. Es ist erwähnenswert, dass Digest::SHA mehrere weitere Algorithmen zur Auswahl hat.
Der Code ist so geschrieben, dass es einfach ist, einen anderen Hash-Algorithmus auszuwählen – kommentieren Sie einen aus und kommentieren Sie die anderen aus, um den für Sie am besten geeigneten auszuwählen. Übrigens, die Ausgabe von _base64
Versionen der Funktionen ist etwas kürzer als _hex
funktioniert, sieht aber eher nach Leitungsrauschen aus.
Ich habe Ihre bereitgestellte Regex vereinfacht (konnte keine Notwendigkeit für ein Look-Behind erkennen). Möglicherweise müssen Sie das ein wenig anpassen, um mit Ihren Eingabedaten zu arbeiten.... Sie haben kein Beispiel bereitgestellt, also habe ich nur geraten.
#!/usr/bin/perl
# choose one of the following digest modules:
use Digest::MD5 qw(md5_hex md5_base64);
#use Digest::SHA qw(sha256_hex sha256_base64);
use strict;
my $salt='secret salt phrase';
# store seen MAC addresses in a hash so we only have to calculate the digest
# for them once. This speed optimisation is only useful if the input file
# is large AND any given MAC address may be seen many times.
my %macs=();
while(<>) {
if (m/clientMac:\s*([A-Z0-9]{12})/i) {
my $mac = $1;
if (!defined($macs{$mac})) {
# choose one of the following digest conversions:
#my $uuid = sha256_hex($mac . $salt);
#my $uuid = sha256_base64($mac . $salt);
my $uuid = md5_hex($mac . $salt);
#my $uuid = md5_base64($mac . $salt);
$macs{$mac} = $uuid;
};
s/(clientMac:\s*)$mac/$1$macs{$mac}/gio;
};
print;
};
Wie im Kommentar gewünscht, hier ein Beispiel, wie man eine solche Ersetzung mit sed
durchführt . Sie haben das /linux-Tag verwendet, daher sollte es sicher sein, GNU sed
zu verwenden mit seinem e
Flag für s
Befehl:
sed -E 'h;s/.*clientMac":\s"([A-Z0-9]{12}).*/echo secretKey\1|md5sum/e;T
G;s/(.*)\s*-\n(.*clientMac":\s")[A-Z0-9]{12}(.*)/\2\1\3/' logfile
Erklärung:
- Der
h
Der Befehl speichert die Zeile im Haltebereich, sodass wir sie wiederherstellen können, nachdem wir die Zeile durcheinander gebracht haben (-; s/.*clientMac":\s"([A-Z0-9]{12}).*/echo secretKey\1|md5sum/e
stimmt mit der gesamten Zeile überein und setzt den tatsächlichen MAC in()
beim Ersatz wiederverwendet werden. Die Ersetzung bildet den auszuführenden Befehl:echo
Fügen Sie das MCA zusammen mit dem "Salz" hinzu und leiten Sie es inmd5sum
. Diee
flag machtsed
Führen Sie dies in der Shell aus und legen Sie das Ergebnis erneut in den PufferT
verzweigt zum Ende des Skripts, wenn keine Ersetzung vorgenommen wurde. Dies dient dazu, Zeilen ohne MAC unverändert zu drucken. Die folgenden Zeilen werden nur ausgeführt, wenn eine Ersetzung vorgenommen wurdeG
hängt die ursprüngliche Zeile aus dem Haltepuffer an, also haben wir jetzt diemd5sum
Ausgabe, ein Zeilenumbruch und die Originalzeile im Puffers/(.*)\s*-\n(.*clientMac":\s")[A-Z0-9]{12}(.*)/\2\1\3/
erfasst den MD5 im ersten Paar von()
, die Zeile vor dem MAC im zweiten und der Rest der Zeile nach dem MAC im dritten, also\2\1\3
ersetzt den MAC durch den MD5
Als alternativen Ansatz habe ich manchmal einfache Zeilennummern als Verschleierungswert verwendet. Dadurch wird die Ausgabe kompakter und besser lesbar.
Auch awk
ist ein gutes Werkzeug, wenn man "intelligente" Operationen an einer Textdatei durchführen muss, die eine besser lesbare Sprache als sed
hat . Die in diesem Fall durchzuführende "intelligente" Operation besteht darin, das erneute Ausführen des Verschleierungsalgorithmus zu vermeiden, wenn eine beliebige MAC-Adresse mehr als einmal angetroffen wird. Dies kann den Betrieb erheblich beschleunigen, wenn Sie Tausende von Zeilen haben, die sich auf eine kleine Anzahl von MAC-Adressen beziehen.
Betrachten Sie in der Praxis das folgende Skript, das auch mögliche mehrfache MAC-Adressen verarbeitet, die in einer Zeile vorkommen, jedes Vorkommen identifiziert und ersetzt und dann am Ende eine Zuordnungstabelle ausgibt:
awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v table='sort -k 1,1n | column -t' -- '
$0 ~ pat {
for (i=1; i <= NF; i++)
if (match($i, pat)) {
if (!($i in cache))
cache[$i]=NR "." i
$i = "MAC:" cache[$i]
}
}
1
END {
print "---Table: "FILENAME"\nnum MAC" | table
for (mac in cache)
print cache[mac], mac | table
}
' file.log
Die Tabelle am Ende kann einfach durch einen zusätzlichen Bearbeitungsschritt von der Hauptausgabe getrennt werden, oder indem man einfach den Befehlsstring in den -v table=
macht -Argument leitet seine Ausgabe in eine Datei um, wie in -v table='sort -k 1,1n | column -t > table'
. Es kann auch ganz entfernt werden, indem man einfach den gesamten END{ … }
entfernt blockieren.
Als Variante mit einer echten Verschlüsselungs-Engine zur Berechnung der Verschleierungswerte und damit ohne Mapping-Tabelle am Ende:
awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='openssl enc -aes-256-cbc -a -pass file:mypassfile' -- '
$0 ~ pat {
for (i=1; i <= NF; i++)
if (match($i, pat)) {
addr = cache[$i]
if (addr == "") {
"echo '\''" $i "'\'' | " crypter | getline addr
cache[$i] = addr
}
$i = "MAC:" addr
}
}
1
' file.log
Hier habe ich openssl
verwendet als Verschlüsselungsmodul, indem Sie dessen aes-256-cbc
auswählen cipher (mit auch einer base64-codierten Ausgabe, um textfreundlich zu sein) und das Lesen des Verschlüsselungsgeheimnisses aus einer Datei mit dem Namen mypassfile
.
Mit einer symmetrischen Verschlüsselung (wie aes-256-cbc
) verschlüsselte Zeichenfolgen ) kann entschlüsselt werden, indem das verwendete Geheimnis bekannt ist (der Inhalt von mypassfile
, die Sie für sich behalten möchten), daher können sie rückgängig gemacht werden. Auch seit openssl
standardmäßig ein zufälliges Salt verwendet, erzeugt jeder Lauf unterschiedliche Werte für dieselbe Eingabe. Kein Salz verwenden (Option -nosalt
) würde openssl
ergeben denselben Wert für jeden Durchlauf erzeugen, also weniger sicher, würde aber andererseits kürzere Texte produzieren, während sie immer noch verschlüsselt sind.
Dasselbe awk
Skript würde für andere externe Befehle anstelle von openssl
funktionieren indem Sie einfach den Befehl im -v crypter=
ersetzen Argument zu awk
, solange der von Ihnen gewählte externe Befehl Eingaben von stdin akzeptieren und Ausgaben auf stdout ausgeben kann.
Mit Algorithmen wie MD5 oder SHA gehashte Zeichenfolgen sind stattdessen nur in eine Richtung (d. h. sie können nicht umgekehrt werden) und erzeugen immer denselben Wert für dieselbe Eingabe, daher sollten Sie sie "salzen", damit die berechneten Werte die in der Ausgabe erzeugt werden, können nicht einfach über alle möglichen MAC-Adressen durchsucht werden. Sie können ein zufälliges "Salz" wie im folgenden leicht modifizierten Skript hinzufügen:
awk -v pat='clientMac"\\s*"[[:xdigit:]]{12}' -v crypter='sha256sum' -- '
$0 ~ pat {
for (i=1; i <= NF; i++)
if (match($i, pat)) {
addr = cache[$i]
if (addr == "") {
"(dd if=/dev/random bs=16 count=1 2>/dev/null; echo '\''" $i "'\'') | " crypter | getline addr
cache[$i] = addr
}
$i = "MAC:" addr
}
}
1
' file.log
Dieses letztgenannte Skript verwendet einen 16 Byte langen (Pseudo-)Zufallswert als "salt", wodurch bei jedem Durchlauf über dieselben Daten ein anderer Hash-Wert erzeugt wird.