字符串中的 Java 掩码密码

Posted

技术标签:

【中文标题】字符串中的 Java 掩码密码【英文标题】:Java Mask Passwords in String 【发布时间】:2022-01-19 11:10:37 【问题描述】:

我正在寻找一种优雅的方式来屏蔽字符串中的密码。我的问题是,找到它们的正则表达式还包含不需要屏蔽的内容,并且正则表达式本身应该可由高级用户维护。

List<String> regexes = List.of("password = (.*)", "pw = (.*)");
regexs.forEach(r -> maskThePw(str, r, "*");
String maskThePw(String str, String regex, String replace)
    return str.replaceAll(regex, replace)

现在这甚至可以与 String.replaceAll 一起使用吗?我尝试将 ""password" : "(.*)"" 作为正则表达式,但这要求我将替换中的第一部分 (password : ) 作为常量。

我尝试将开头分组:

requestStr.replaceAll("(\"password\" : \")(.*)\"", "$1*****")

这可行 - 在某种程度上,但需要组的数量保持不变,因为我希望模式是可变的。在这种情况下。我需要知道 $2 是密码,$1 是之前的密码。

我错过了什么吗?我想搜索某个字符串并将组 $1 替换为与它包含的相同数量的星号。如果不可能,也可以使用固定数量的星号(如我的示例所示)。

想要的输出是:

Input:
password = "test", username = "test"

Output:
password = "****", username = "test"

但也适用于其他情况:

Input:
secret = "test", username = "test"

Output:
secret = "****", username = "test"

而必须可以动态添加触发屏蔽的新模式。比如“key”、“hidden”之类的。

谢谢!

【问题讨论】:

当您声明时您到底想解决什么问题:This works - to some degree but requires the amount of groups to be constant. 您可能想重新访问minimal reproducible example。 为什么需要组? replaceAll("\"password\" : \".*\"", "\"password\": *****") 做同样的工作。 显示哈希是否重要? 如果有人在密码中使用双引号 ("),您希望您的代码做什么? 【参考方案1】:

所以我同时自己解决了:

但是,请始终欢迎提出使其更优雅或更高效的建议。

private String mask(final String str)

    String newStr = str;
    final String[] masks = getConfiguration()
        .getString(LOG_MASK_REGEX).split(SEMICOLON);
    final String maskCharacter = getConfiguration()
        .getString(LOG_MASK_CHARACTER, ASTERISK);
    for (final String mask : masks)
    
        final Pattern pattern = Pattern.compile(mask, Pattern.DOTALL);
        final Matcher matcher = pattern.matcher(newStr);
        if (matcher.matches())
        
            final String found = matcher.group(1);
            newStr = newStr.replace(found, StringUtils.repeat(maskCharacter, found.length()));
        
    
    return newStr;

这些是属性中配置的正则表达式:

log.mask.regex = .*"password" : "(.*?)".*;.*"username" : "(.*?)".*;.*"email" : "(.*?)".*

【讨论】:

以上是关于字符串中的 Java 掩码密码的主要内容,如果未能解决你的问题,请参考以下文章

Java中的右对齐字符串NumberFormat

java密码:密码为0-9、a-z的字符组合,密码中的字符区分大小写

Java 使用 char[] Array 还是 String 存储字符串密码

ios中的电话号码格式掩码

SIMD,SSE,AVX - 掩码 8 浮动无符号字符? [复制]

如何在 jquery 掩码中删除空格