2

我想在 json 字符串中隐藏某些密码类型的单词,例如:

"password":"foobar1"

将被替换为

"password":"XXXXX"

或者

"pwd":"foobar1"

将被替换为

"pwd":"XXXXX"

我能够使用以下 Pattern 和 replaceAll 方法来做到这一点

REGEX_JSON_PASSWORD = 
    Pattern.compile("\"(?i)(password|pwd)\":\"[\\w\\p{Punct}&&[^&]]*?\"");
replacementString = 
    REGEX_JSON_PASSWORD.matcher(returnMe).replaceAll("\"$1\":\"XXXXXXXXXXXXXXXX\"");

我不喜欢在替换字符串中添加双引号,但如果我不添加它们,我得到的只是

pwd:foobar1 

(没有引号)

有没有比上面显示的更有效的方法来实现 replaceAll?

4

3 回答 3

2

首先,一个好方法是使用 json 解析器对 JSON 进行更改。

用你的方法:

将您的模式和替换更改为:

pattern: (?<=\"(?i)p(?>assword|wd)\":\")[^\"]++ 
replacement: XXXXXXXXXXXXXXXX

有了这个,您可以避免在替换中引用问题和反向引用,因为您只匹配了您需要的内容: foobar1

于 2013-06-09T22:54:44.460 回答
1

afaict,字符串替换最好使用正则表达式来完成,尽管它们看起来很丑陋。

我认为您通过以下方式解决了问题:

REGEX_JSON_PASSWORD = Pattern.compile("\"(?i)(password|pwd)\":\"[\\w\\p{Punct}&&[^&]]*?\"");
replacementString =  REGEX_JSON_PASSWORD.matcher(returnMe).replaceAll("\"$1\":\"XXXXXXXXXXXXXXXX\"");

如果您保持REGEX_JSON_PASSWORD实例化一次,并replacementString在每个字符串上应用。

但是,如果您将数据提供给 JSON 解析器(如 gson),您可能希望在密码字符串被序列化为 JSON 之前替换密码字符串,因此只需对字符串的值进行简单愚蠢的替换。但这一切都取决于您的代码的上下文。

于 2013-06-09T23:06:47.007 回答
-1

你也可以在 PHP 领域做这样的事情:

// Obfuscate / mask password in JSON string
$json = preg_replace('/"(pass|password)":"(.*?)"/i', '"$1":"****"', $json);
于 2014-03-18T23:01:55.283 回答