Как замаскировать личную информацию, используя любой язык, например, Java?

1

Я хочу скрыть PII (персональная идентификационная информация), например Name. Дата рождения, SSN, Номер кредитной карты, Номер телефона и т.д. Он должен оставаться одним и тем же форматом, означает, что он выглядит как реальные данные. И не должно быть обратимым. И для маскировки требуется меньше времени. Любой, пожалуйста, помогите мне.

Теги:
encryption
data-masking
privacy

1 ответ

1
Лучший ответ

Замена согласных согласными, гласные с гласными и цифры с цифрами:

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, Wherever, XY. (888) 535-3593. 399-35-3535

Это вам, чтобы генерировать семена. Используйте семя на основе входных данных (например, контрольной суммы), а также последовательный RNG, если вы хотите гарантировать, что один и тот же вход всегда производит одинаковый вывод.

Оптимизацию производительности можно было бы сделать, используя таблицу классов символов, а не, например, vowel.indexOf(). Дальнейшие микрооптимизации могут быть сделаны (например, повторное использование Random, работающее только на char[] и сокращение новых распределений String и т.д.),

Тяжелые трудности будут возникать при полной поддержке Unicode. Маскировка также не изменяет длину компонентов.

За все это я бы оценил этот плохой, но, по крайней мере, умеренно интересный алгоритм.

Я не думаю, что вы понимаете, что то, о чем вы просите (вывод, который выглядит реальным) выходит за рамки обычных тем шифрования и не поддается "эффективности", так как потребуется некоторое количество морфологического анализа для производства (и опять же интернационализация усложняет это).

  • 0
    Спасибо Джейсон. Это дает мне хорошее направление для моего алгоритма.
  • 0
    @BrijeshPatel Рад, что это помогло; удачи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню