我想掩盖姓名之类的PII(个人身份信息)。出生日期,SSN,信用卡号,电话号码等。应保持相同的格式,表示看起来像真实数据。而且不应该是可逆的,并且应该花费更少的时间来掩盖。任何人请帮助我。

最佳答案

用辅音替换辅音,用元音替换元音,并用数字替换数字:

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,Qlik。 (557)722-5385。 055-08-1462


从输入:

    约翰·多伊(John Doe),西大街534号,XY,任何地方。 (888)535-3593。 399-35-3535


生成种子取决于您。如果要确保相同的输入始终产生相同的输出,请使用基于输入数据(例如校验和)和一致的RNG的种子。

可以通过使用字符类表而不是例如字符表来进行性能优化。 vowel.indexOf()。可以进行进一步的微优化(例如重新使用Random,仅在char[]上运行并减少新的String分配等)。

全面的Unicode支持将遇到很大的困难。遮罩也不会更改组件的长度。

总的来说,我认为这是一个糟糕的算法,但至少有一定的吸引力。

我不认为您了解所要求的(看起来真实的输出)超出了常规加密主题的范围,并且无法很好地发挥“效率”,因为可能需要进行一些形态分析有意义的结果(国际化再次使这一点变得非常复杂)。

关于java - 如何使用任何语言(例如Java)掩盖个人身份信息?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22387577/

10-12 19:22