GNU/Linux >> Linux の 問題 >  >> Linux

MAC アドレスを UUID に置き換えます

次の perl スクリプトは Digest::MD5 のいずれかを使用します または Digest::SHA モジュールを使用して、秘密のソルトを使用して MAC アドレスをハッシュに変換します。モジュールの詳細については、モジュールのマニュアル ページを参照してください。 Digest::SHA には、選択できるアルゴリズムが他にもいくつかあることに注意してください。

このコードは、別のハッシュ アルゴリズムを簡単に選択できるように記述されています。1 つをコメント解除し、他のハッシュ アルゴリズムをコメントアウトして、最適なものを選択してください。ところで、_base64 からの出力 関数のバージョンは _hex より少し短いです 関数ですが、回線ノイズのように見えます。

提供された正規表現を簡略化しました(後読みの必要はありませんでした)。入力データを操作するには、少し調整する必要があるかもしれません....サンプルを提供していないので、推測しただけです.

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

コメントで要求されているように、 sed でこのような置換を実行する方法の例を次に示します . /linux タグを使用したので、GNU sed を使用しても安全です。 es のフラグ コマンド:

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

説明:

  • h コマンドは行を保留スペースに保存するので、行を台無しにした後に元に戻すことができます (-;
  • s/.*clientMac":\s"([A-Z0-9]{12}).*/echo secretKey\1|md5sum/e 行全体に一致し、実際の MAC を () に入れます 交換で再利用します。置換は、実行されるコマンドを形成します:echo MCA を「salt」と一緒に ing し、それを md5sum にパイプします。 . e フラグは sed になります これをシェルで実行し、結果を再びバッファに入れます
  • T 置換が行われなかった場合、スクリプトの最後に分岐します。これは、MAC を変更せずに行を印刷するためのものです。次の行は、置換が行われた場合にのみ実行されます
  • G ホールド バッファから元の行を追加するため、md5sum が得られます。 出力、バッファ内の改行と元の行
  • s/(.*)\s*-\n(.*clientMac":\s")[A-Z0-9]{12}(.*)/\2\1\3/ () の最初のペアで MD5 をキャプチャします 、2 番目の MAC の前の行と 3 番目の MAC の後の行の残りの部分、したがって \2\1\3 MAC を MD5 に置き換えます

別のアプローチとして、単純な行番号を難読化値として使用することもありました。これにより、出力がよりコンパクトになり、読みやすくなります。

また、awk sed よりも読みやすい言語を使用して、テキスト ファイルに対して「スマートな」操作を実行する必要がある場合に適したツールです。 .この場合に実行する「賢い」操作は、1 つの MAC アドレスが複数回検出されたときに難読化アルゴリズムを再実行しないことです。少数の MAC アドレスを参照する行が数千行ある場合、これにより操作が大幅に高速化されます。

実際には、次のスクリプトを検討してください。このスクリプトは、任意の 1 行に出現する可能性のある複数の MAC アドレスを処理し、各出現を識別して置換し、最後にマッピング テーブルを出力します:

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

最後のテーブルは、編集手順を追加するか、コマンド文字列を -v table= 内に作成するだけで、メイン出力から簡単に分離できます。 引数は -v table='sort -k 1,1n | column -t > table' のように出力をファイルにリダイレクトします . END{ … } 全体を削除するだけで完全に削除することもできます ブロックします。

バリアントとして、実際の暗号化エンジンを使用して難読化値を計算するため、最後にマッピング テーブルはありません:

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

ここでは openssl を使用しました aes-256-cbc を選択する暗号化エンジンとして cipher (テキストに適したものにするために base64 でエンコードされた出力も含む)、および mypassfile という名前のファイルから暗号化シークレットを読み取るようにします。 .

対称暗号 (aes-256-cbc など) で暗号化された文字列 ) は、使用されているシークレット (mypassfile の内容) を知ることで復号化できます。 、自分用に保持したい)、したがって、それらを元に戻すことができます。また、openssl 以降 デフォルトではランダムソルトを使用し、各実行は同じ入力に対して異なる値を生成します。ソルトを使用しない (オプション -nosalt ) は openssl になります 実行ごとに同じ値を生成するため、安全性は低くなりますが、暗号化されたまま短いテキストが生成されます。

同じ awk スクリプトは openssl の代わりに他の外部コマンドで機能します -v crypter= のコマンドを置き換えるだけで awk への引数 、選択した外部コマンドが stdin からの入力を受け入れ、出力を stdout に出力できる限り。

MD5 や SHA などのアルゴリズムでハッシュ化された文字列は一方向のみ (つまり、元に戻すことはできません) であり、同じ入力に対して常に同じ値を生成するため、計算された値が出力で生成されるすべての可能な MAC アドレスを検索することはできません。次のわずかに変更されたスクリプトのように、ランダムな「塩」を追加できます:

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

この後者のスクリプトは、16 バイト長の (疑似) ランダム値を「salt」として使用するため、同じデータに対して実行するたびに異なるハッシュ値を生成します。


Linux
  1. MAC アドレスの取得

  2. sed のようなテキストを python に置き換えるにはどうすればよいですか?

  3. Linuxでjar内のファイルをコマンドラインに置き換える方法は?

  1. 1つのSudoで一連のコマンドを実行しますか?

  2. MACアドレスをファイルに出力

  3. 各行末の空白の各文字を「_」に置き換えます

  1. 行の範囲を行の範囲(sedまたはその他)に置き換えますか?

  2. パターンに一致する行を別のファイルの行に順番に置き換えますか?

  3. 改行をNulに置き換えますか?