📝

Kotlin Serializationで値をマスクする

2024/01/08に公開

みなさん、kotlin-serialization使っていますか?

https://kotlinlang.org/docs/serialization.html

Kotlinが公式に提供しているシリアライズ機能です。

この記事では、kotlinx-serializationでデータをシリアライズする際に、特定のフィールドをマスクする方法を備忘録的に残しておきます。

ちなみに、今回はJsonを対象とします。

JsonTranformSerializerを定義する

下記のように、 JsonTransformerSerializerを継承したやつを作ります。

@Serializable
class Credential(
    val username: String,
    val password: String,
    val raw_password: String
)


val s = object: JsonTransformingSerializer<T>(Credential.serializer()){
    override fun transformSerialize(element: JsonElement): JsonElement =
    JsonObject(element.jsonObject.mapValues {
        if(lowerMask.contains(it.key.lowercase())){
            return@mapValues JsonPrimitive("*".repeat(it.value.toString().length.coerceAtMost(32)))
        }
        return@mapValues when (it.value) {
            is JsonArray -> JsonArray(it.value.jsonArray.map { transformSerialize(it) })
            is JsonObject -> transformSerialize(it.value)
            else -> it.value
        }
    })
}

ちなみに、lowerMaskは、マスクしたいフィールド名をlowercaseにしたリストで、今回はlistOf("password")だと思ってください。

つかう

使います。説明が雑

val credential = Credential(
     username = "user_name",
     password = "this field is masked",
     raw_passeord = "this field is not masked"
)

Json.encodeToJsonElement(s, credential)

// {"username":"user_name","password":"**********************","raw_password":"this field is not masked"}

Discussion