名前などのPII(個人識別情報)をマスクしたい。生年月日、社会保障番号、クレジット カード番号、電話番号など。同じ形式のままである必要があります。つまり、実際のデータのように見えます。また、可逆的であってはなりません。また、マスキングにかかる時間も短縮されるべきです。誰でも私を助けてください。
10060 次
1 に答える
3
子音を子音に、母音を母音に、数字を数字に置き換える:
import java.util.Random;
public class Example {
static char randomChar (Random r, String cs, boolean uppercase) {
char c = cs.charAt(r.nextInt(cs.length()));
return uppercase ? Character.toUpperCase(c) : c;
}
static String mask (String str, int seed) {
final String cons = "bcdfghjklmnpqrstvwxz";
final String vowel = "aeiouy";
final String digit = "0123456789";
Random r = new Random(seed);
char data[] = str.toCharArray();
for (int n = 0; n < data.length; ++ n) {
char ln = Character.toLowerCase(data[n]);
if (cons.indexOf(ln) >= 0)
data[n] = randomChar(r, cons, ln != data[n]);
else if (vowel.indexOf(ln) >= 0)
data[n] = randomChar(r, vowel, ln != data[n]);
else if (digit.indexOf(ln) >= 0)
data[n] = randomChar(r, digit, ln != data[n]);
}
return new String(data);
}
public static void main (String[] args) {
System.out.println(mask("John Doe, 534 West Street, Wherever, XY. (888) 535-3593. 399-35-3535", 0));
}
}
それは出力を生成します:
Bumk Tyy, 194 Wyrd Tggoyb, Flikibod, QY. (557) 722-5385。055-08-1462
入力から:
John Doe、534 West Street、どこでも、XY。(888) 535-3593。399-35-3535
シードを生成するのはあなた次第です。同じ入力が常に同じ出力を生成することを保証する場合は、入力データ (チェックサムなど) に基づくシードと一貫性のある RNG を使用します。
の代わりに文字クラス テーブルを使用することで、パフォーマンスの最適化を行うことができますvowel.indexOf()
。さらにマイクロ最適化を行うことができます (例: の再利用、新しい割り当てRandom
のみの操作char[]
、削減など)。String
Unicode を完全にサポートすると、大きな問題が発生します。マスキングはコンポーネントの長さも変更しません。
全体として、私はこれを貧弱であると評価しますが、少なくとも適度に興味深いアルゴリズムです.
あなたが求めているもの (本物に見える出力) は、通常の暗号化トピックの範囲外であり、「効率」にはあまり適していないことを理解していないと思います。意味のある結果が得られます (また、国際化によってこれが大幅に複雑になります)。
于 2014-03-13T18:58:53.477 に答える