如何使用java等语言掩盖个人身份信息?

时间:2014-03-13 18:22:59

标签: java encryption privacy data-masking

我想屏蔽像姓名一样的PII(个人识别信息)。出生日期,SSN,信用卡号码,电话号码等。它应该保持相同的格式,意味着它看起来像真实的数据。并且不应该是可逆的。它应该花费更少的时间来掩盖。任何人请帮助我。

1 个答案:

答案 0 :(得分: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会遇到严重困难。掩蔽也不会改变组件的长度。

总而言之,我认为这是一个很差但很有趣的算法。

我认为你不明白你要求的是什么(看起来真实的输出)超出了普通加密主题的范围,并且不适合“效率”,如需要进行一定数量的形态分析才能产生有意义的结果(同样,国际化也会使这种结果复杂化)。