2

名前などのPII(個人識別情報)をマスクしたい。生年月日、社会保障番号、クレジット カード番号、電話番号など。同じ形式のままである必要があります。つまり、実際のデータのように見えます。また、可逆的であってはなりません。また、マスキングにかかる​​時間も短縮されるべきです。誰でも私を助けてください。

4

1 に答える 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 に答える