📝
Kotlin Serializationで値をマスクする
みなさん、kotlin-serialization
使っていますか?
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