如何在Scala中屏蔽JSON测试中的敏感字段(如密码)?

时间:2019-04-10 20:37:07

标签: json regex scala data-masking

所以这听起来像一个面试问题,但事实并非如此。在将其标记为重复之前,请知道我已经查看了其他答案:1.没有scala解决方案,2.我的案件需要一种屏蔽多个匹配密钥的方法。

我有一个可以发出所有http请求的def。发送请求后,我记录了请求和响应。由于这些请求的JSON正文可能包含也可能不包含以下敏感字段:

challengeAnswer
currPassword
password
answer
oldPassword

我想创建一个通用的JSON扫描器,该DEEP扫描给定JSON对象的键,并在不区分大小写的情况下匹配其中一个正则表达式时屏蔽该值:

.*answer.*
.*password.*

样品申请正文:

{
    "resetPassQuestion1": "I pity the ...?",
    "resetPassAnswer1": "Foo",
    "resetPassQuestion2": "Let's grab a pint at the ...?",
    "resetPassAnswer2": "Bar",
    "firstname": "John",
    "lastname": "Doe",
    "email": "john.doe@example.com",
    "loginId": "jdoe666",
    "password": "Secret1"
}

在此示例中,我需要用5个星号遮盖Foo,Bar和Secret1,例如,当我在日志中打印时,它将打印:

{
    "resetPassQuestion1": "I pity the ...?",
    "resetPassAnswer1": "*****",
    "resetPassQuestion2": "Let's grab a pint at the ...?",
    "resetPassAnswer2": "*****",
    "firstname": "John",
    "lastname": "Doe",
    "email": "john.doe@example.com",
    "loginId": "jdoe666",
    "password": "*****"
}

我没有找到不区分大小写的示例。什么是通过易于阅读的代码解决此问题的好方法。

1 个答案:

答案 0 :(得分:1)

所以我用LiftJson的变换解决了它。

import net.liftweb.json.JsonParser
import net.liftweb.json.Printer.compact
import net.liftweb.json.JsonAST._

private def maskPasswords(jsonStr: String): String = {
    Try(JsonParser.parse(jsonStr)) match {
        case Success(json) => {
            compact(
                render(
                    json.transform {
                        case JField("password",_) => JString("*****")
                        case JField("oldPassword",_) => JString("*****")
                        case JField("resetPassAnswer2",_) => JString("*****")
                        case JField("resetPassAnswer1",_) => JString("*****")
                    }
                )
            )
        }
        case _ => "**** JsonParsing Failed! **** Masking Everything *****"
    }
}

由于我想掩盖的每个新领域都不是完美的,我必须在这里添加新行,但是目前对我来说已经足够好了。