回答:
このことを考えるだけで、100点の賛成票を投じることができたらと思います!私はこの主題が何度も見落とされているのを見たことがあります。私が理解していることから、あなたは実際にフィールド自体内のデータをスクランブルしたいのですが、あなたが達成しようとしていることを理解しているにもかかわらず、そうすることはそれほど必要ではないかもしれません-それはケースバイケースで考慮されるべきです。
ほとんどのデータ保護法は、たとえば生年月日や電話番号など、データと個人を正しく関連付ける機能を中心に展開されています。データを本番環境からUATに移動する際にデータがゴチャゴチャになり、元の人に簡単に再マッピングされないようにすることにより、法律の要件を満たすことができます-特に、名前と姓をゴチャゴチャする場合。
ただし、たとえば連絡先の詳細などの問題は解決しません。データをごちゃ混ぜにすることで法律の要件を満たすことができますが、電話番号はまだ本物であり、電子メールはまだ本物です...それらは正しい人に割り当てられていないだけです。このため、データをUATに渡す前に可能な限り消去することをお勧めします.Red Gateは、データジェネレーターと呼ばれるソフトウェアを実行し、ランダムなテストデータを作成して、テスト可能なデータをフィールドに再入力できるようにします。
データのスクランブルに関しては、あなたのためにこれを行う多くのアプリケーションが存在し、正直なところ、あなたは車輪を再発明したくないのは正しいです。当社で使用しているのは、Net2000という会社のData Maskerという製品です。ライセンスは非常に安く、非常に高速に動作し、データベースをスクランブルする前にすべての制約を無効にする必要があることを心配する必要はありません。
もちろん、要件を満たすものが見つからない場合は、独自のソリューションを展開できます-これを行うことにした場合、CLRプロシージャを使用してそれを実行することを強くお勧めしますTSQLを使用できない場合は、こちらをご覧ください)。
これを実行するアプリケーションを選択したら、次に決定する必要があるのは、実際にスクランブルしたい/必要なものは何ですか?正直なところ、これに最適なリソースは、会社の法務チームまたは監査人です。私は時々彼らと一緒に仕事をするのが好きではないかもしれないことを知っていますが、彼らはあなた自身にそれをして間違ってしようとするのではなく、彼らに近づき質問をする方があなたにとってはるかに良いでしょう、助けを求めることは絶対に悪いことではありません-特にこれと同じくらい重要な場合。
これがあなたのお役に立てば幸いです。そして、あなたの探求に幸運を祈ります... ;-)
ブラウンストーン氏は頭に釘を打ちました。ここで少し手助けするために、ここに文字列を難読化するために使用される私の「文字化け」関数があります(名前の面白い結果!)。文字列を渡すと、文字化けした文字列が返されます。文字列列に対する更新ステートメントにそれを含めます。必要に応じてデータ長を変更します。
---------------------
-- Garble Function --
---------------------
-- Make a function to slightly garble the strings
IF (object_id('fn_Garble') is not null)
drop function fn_Garble
go
create function fn_Garble
(
@String varchar(255)
)
returns varchar(255)
as
BEGIN
select @String = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@String,'o','e'),'a','o'),'i','a'),'u','i'),'t','p'),'c','k'),'d','th'),'ee','e'),'oo','or'),'ll','ski')
return @String
END
go
クライアントの小売販売データに対してこれを行う必要がありました。名前については、国勢調査に行き、すべての名と姓をダウンロードし、それらをループで実行して、名字ごとに結合し、性別コードを追加して、すべて大文字でテーブルにロードしました。その後、約4億の一意の名前を持つテーブルがありました。現在のデータが大文字ではないため、大文字を使用しました。そのため、スクラブされたデータをより簡単に識別できました。
ユーザーデータをスクラブしたとき、名前を入れ替えました。誕生日には、実際に生まれた年の1月1日に全員を置き、郵便番号で電話番号を更新しました(私のデータは米国のみ)。電子メールアドレスは、最初の姓に加えて@ mycompany.coになりました。郵便住所は私に最も悲しみを与えましたが、住所が変更されても問題ではないと信じているので、私は都市、州、郵便番号を保持しました。文字化けした文字を生成し、それで住所行を更新するプログラムを持っている同僚がいました。
データを複製したどこでもメインユーザーにFKがありました(デザインは悪いですが、私のものではありません)そのデータも更新して、ユーザーxのデータベース全体で名前が一致するようにしました。
住所は意味がありませんでしたが、全体的に私のデータは非常に読みやすくなっています。このすべてを機能させるのに数日かかりましたが、いったん完了してSQLエージェントジョブが作成されると、わずか15分でデータをスクラブできました。
単一のフィールドを難読化するには、HASHBYTES関数(SQL 2008+)を使用してください。データをソルトできれば、アルゴリズムを選択できます(MD5で十分でしょう)。そのSELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>)
ため、単に確認する代わりに、
SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')
簡単にブルートフォースすることができないハッシュを取得します。
これは、サポート可能で再現性のある実際の機能であり、おそらくはるかに高速です。本当に難読化するか、単に難読化する必要があるかに応じて、より弱い、より速いハッシュを使用することもできます。
MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512
です。(はい、使用すべきでないものを含む)。したがって、SHA2_512を使用しているとしましょう...
Chrissy Lemaire(@ chrissy-lemaire)と彼女のチームが書いた静的データマスキングの無料オプションについては、dbatools PowerShellモジュールをご覧ください。それらのツールはすべて素晴らしいので、これは一見の価値があると確信しています。
dbatoolsで検索する2つのコマンドは次のとおりです。New-DbaDbMaskingConfig Invoke-DbaDbDataMasking
これを発表しているブログ投稿を見てください:自動データマスキング