GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ersetzen Sie die MAC-Adresse durch die UUID

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 in md5sum . Die e flag macht sed Führen Sie dies in der Shell aus und legen Sie das Ergebnis erneut in den Puffer
  • T 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 wurde
  • G hängt die ursprüngliche Zeile aus dem Haltepuffer an, also haben wir jetzt die md5sum Ausgabe, ein Zeilenumbruch und die Originalzeile im Puffer
  • s/(.*)\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.


Linux
  1. Wie ersetzt man sed wie Text durch Python?

  2. Wie ersetze ich eine Datei im JAR durch die Befehlszeile in Linux?

  3. Ersetzen Sie gitolite3-Benutzer durch git

  4. Mac-Adresse in Datei drucken

  5. Ersetzen Sie Zeilen in einer Datei durch Zeilen in einer anderen durch die Zeilennummer

Ersetzen Sie unter Linux du durch Staub

Linux-IP-Befehl mit Verwendungsbeispielen

So ersetzen Sie Docker durch Podman auf einem Mac, überarbeitet

So ersetzen Sie Docker durch Podman auf einem Mac

So ändern Sie die Netzwerk-MAC-Adresse in Linux

So ändern Sie die MAC-Adresse in Linux