ログファイルを使用して顧客にデータを提示する前に、ログファイルに表示されるたびにクライアントのMACアドレスをマスクする方法を探しています(GDPRルール)。
私は正規表現を使用してMAC文字列を識別できますが、MD5はほとんど透過的であるため、MD5は推奨されないようなので、最適なマスキング方法はわかりません。
MACはさまざまなタイミングで着信するため、特定のMACが常に同じマスク/ uuidを返す必要があり、特定のMACがシステムを通過するときに追跡する必要があります。
使用される正規表現は(?<=clientMac":\s")[A-Z0-9]{12}
理想的には、sed
のような単純なものを使用して置換を行いたいのですが、可能ではないことを認めます。
コメントで要求されているように、sed
でこのような置換を実行する方法の例を次に示します。/linuxタグを使用したので、sed
コマンドにe
フラグを付けてGNU 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を_()
_に入れて、置換で再利用します。置換により、実行されるコマンドが形成されます。MCAをecho
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
_がMD5を備えたMAC次の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;
};