次の 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
を使用しても安全です。 e
で s
のフラグ コマンド:
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」として使用するため、同じデータに対して実行するたびに異なるハッシュ値を生成します。