web-dev-qa-db-ja.com

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

ログファイルを使用して顧客にデータを提示する前に、ログファイルに表示されるたびにクライアントのMACアドレスをマスクする方法を探しています(GDPRルール)。

私は正規表現を使用してMAC文字列を識別できますが、MD5はほとんど透過的であるため、MD5は推奨されないようなので、最適なマスキング方法はわかりません。

MACはさまざまなタイミングで着信するため、特定のMACが常に同じマスク/ uuidを返す必要があり、特定のMACがシステムを通過するときに追跡する必要があります。

使用される正規表現は(?<=clientMac":\s")[A-Z0-9]{12}

理想的には、sedのような単純なものを使用して置換を行いたいのですが、可能ではないことを認めます。

6
Rob Davie

コメントで要求されているように、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をechoingし、「塩」とともに_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
3
Philippos

次の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;
};
3
cas