GNU/Linux >> Belajar Linux >  >> Linux

Ganti alamat MAC dengan UUID

perl berikut skrip menggunakan Digest::MD5 atau Digest::SHA modul untuk mengubah alamat MAC menjadi hash, menggunakan garam rahasia. Lihat halaman manual modul untuk detail lebih lanjut. Perlu diperhatikan bahwa Digest::SHA memiliki beberapa algoritme lain untuk dipilih.

Kode ini ditulis untuk memudahkan memilih algoritme hashing yang berbeda - batalkan komentar satu dan komentari yang lain untuk memilih mana yang paling cocok untuk Anda. BTW, output dari _base64 versi fungsinya sedikit lebih pendek dari _hex fungsi tetapi lebih mirip line-noise.

Saya menyederhanakan regex yang Anda sediakan (tidak melihat kebutuhan untuk melihat ke belakang). Anda mungkin perlu mengubahnya sedikit untuk bekerja dengan data masukan Anda.... Anda tidak memberikan sampel apa pun, jadi saya hanya menebak.

#!/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;
};

Seperti yang diminta dalam komentar, berikut adalah contoh cara melakukan substitusi dengan sed . Anda menggunakan tag /linux, jadi aman untuk menggunakan GNU sed dengan e bendera untuk s perintah:

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

Penjelasan:

  • h perintah menyimpan baris ke ruang tunggu, sehingga kami dapat memulihkannya setelah mengacaukan baris (-;
  • s/.*clientMac":\s"([A-Z0-9]{12}).*/echo secretKey\1|md5sum/e cocok dengan seluruh baris, menempatkan MAC sebenarnya di () untuk digunakan kembali dalam penggantian. Pengganti membentuk perintah yang akan dieksekusi:echo ing MCA bersama dengan "garam" dan menyalurkannya ke md5sum . e bendera menghasilkan sed jalankan ini di shell dan letakkan kembali hasilnya di buffer
  • T bercabang ke akhir skrip jika tidak ada penggantian yang dilakukan. Ini untuk mencetak garis tanpa MAC yang tidak dimodifikasi. Baris berikut dijalankan hanya jika penggantian telah dilakukan
  • G menambahkan baris asli dari buffer penahan, jadi sekarang kita memiliki md5sum output, baris baru dan baris asli di buffer
  • s/(.*)\s*-\n(.*clientMac":\s")[A-Z0-9]{12}(.*)/\2\1\3/ menangkap MD5 pada pasangan pertama () , baris sebelum MAC di baris kedua dan sisa baris setelah MAC di baris ketiga, jadi \2\1\3 mengganti MAC dengan MD5

Sebagai pendekatan alternatif, terkadang saya menggunakan nomor baris sederhana sebagai nilai kebingungan. Ini membuat keluaran lebih padat dan lebih mudah dibaca.

Juga, awk adalah alat yang baik ketika seseorang perlu melakukan operasi "pintar" pada file teks, memiliki bahasa yang lebih mudah dibaca daripada sed . Operasi "pintar" yang harus dilakukan dalam hal ini adalah menghindari eksekusi ulang algoritme kebingungan ketika salah satu alamat MAC ditemukan lebih dari satu kali. Ini dapat sangat mempercepat operasi jika Anda memiliki ribuan baris yang merujuk ke sejumlah kecil alamat MAC.

Dalam praktiknya, pertimbangkan skrip berikut, yang juga menangani kemungkinan beberapa alamat MAC yang terjadi pada satu baris, mengidentifikasi dan mengganti setiap kejadian, lalu mencetak tabel pemetaan di bagian akhir:

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

Tabel di bagian akhir dapat dengan mudah dipisahkan dari keluaran utama dengan langkah pengeditan tambahan, atau hanya dengan membuat string perintah di -v table= argumen mengarahkan outputnya ke file, seperti di -v table='sort -k 1,1n | column -t > table' . Itu juga dapat dihapus sama sekali hanya dengan menghapus seluruh END{ … } blokir.

Sebagai varian, menggunakan mesin enkripsi asli untuk menghitung nilai obfuscation dan karenanya tanpa tabel pemetaan di bagian akhir:

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

Di sini saya menggunakan openssl sebagai mesin enkripsi memilih aes-256-cbc cipher (dengan juga output berenkode base64 agar ramah teks), dan membuatnya membaca rahasia enkripsi dari file bernama mypassfile .

String dienkripsi dengan cipher simetris (seperti aes-256-cbc ) dapat didekripsi dengan mengetahui rahasia yang digunakan (isi mypassfile , yang ingin Anda simpan sendiri), sehingga dapat dibalik. Juga, sejak openssl menggunakan garam acak secara default, setiap proses menghasilkan nilai yang berbeda untuk input yang sama. Tidak menggunakan salt (opsi -nosalt ) akan membuat openssl menghasilkan nilai yang sama untuk setiap proses, jadi kurang aman, tetapi di sisi lain akan menghasilkan teks yang lebih pendek sambil tetap dienkripsi.

awk yang sama skrip akan berfungsi untuk perintah eksternal lainnya, bukan openssl dengan hanya mengganti perintah di -v crypter= argumen ke awk , selama perintah eksternal yang Anda pilih dapat menerima input dari stdin dan mencetak output ke stdout.

String yang di-hash dengan algoritme seperti MD5 atau SHA hanya satu arah (yaitu tidak dapat dibalik), dan selalu menghasilkan nilai yang sama untuk input yang sama, oleh karena itu Anda ingin "memberi garam" pada string sehingga nilai yang dihitung dihasilkan dalam output tidak bisa hanya dicari di semua alamat MAC yang mungkin. Anda dapat menambahkan "garam" acak seperti pada skrip yang sedikit dimodifikasi berikut:

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

Skrip terakhir ini menggunakan nilai acak sepanjang 16 byte (pseudo-) sebagai "salt", sehingga menghasilkan nilai hash yang berbeda pada setiap proses pada data yang sama.


Linux
  1. Jalankan Baris Perintah Dengan Satu Sudo?

  2. Ganti Rentang Garis Dengan Rentang Garis (sed Atau Lainnya)?

  3. Ganti Garis yang Mencocokkan Pola Dengan Garis Dari File Lain Secara Berurutan?

  1. Ganti Baris Baru Dengan Nul?

  2. Mendapatkan Alamat MAC

  3. Bagaimana cara mengganti file di jar dengan baris perintah di linux?

  1. Ganti pengguna gitolite3 dengan git

  2. Ganti setiap karakter spasi putih di akhir setiap baris dengan '_'

  3. cara menghasilkan alamat MAC acak dari baris perintah Linux