如何使用java等语言屏蔽个人身份信息?

问题描述 投票:0回答:2

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

java encryption privacy data-masking
2个回答
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 支持将会遇到很大的困难。掩蔽也不会改变组件的长度。

总的来说,我认为这是一个很差但至少还算有趣的算法。

我认为您不明白您所要求的(输出看起来真实)超出了正常加密主题的范围,并且不适合“效率”,因为一定量的形态分析将是需要产生有意义的结果(同样,国际化使这一点变得非常复杂)。


0
投票

您可以使用以下免费/开源独立 java 实用程序。它非常高效,可以在短短几分钟内混淆数十亿条记录。

该实用程序使用数据脱敏技术(用随机生成的假数据替换真实数据,数据值发生变化,但格式保持不变)提供数据混淆(或数据匿名化)。

https://github.com/pajohri/jdotm

这是一个例子 -

PJObfuscateUtil obfuscateUtil = new PJObfuscateUtil(100);
//invoke getObfuscated method to reterive the obfucated value
System.out.println("Test Value 123 -> " + 
obfuscateUtil.getObfuscated("Test Value 123"));

您可以将此实用程序插入到您的程序中,并混淆 XML 或您喜欢的任何其他位置中的值。

此实用程序还支持多语言字符。

我还建议查看 github 页面中提到的常见问题解答。

© www.soinside.com 2019 - 2024. All rights reserved.