🔒 Sensitive Data Redactor

KNETSensitiveDataRedactor automatycznie ukrywa wrażliwe dane w logach - hasła, tokeny, numery kart kredytowych i inne PII.

⚠️ Ważne dla bezpieczeństwa

Zawsze używaj redactora przy logowaniu requestów/response w produkcji. Przypadkowe logowanie sekretów może prowadzić do wycieków danych.

📦 Import

import rip.nerd.kitsunenet.util.KNETSensitiveDataRedactor
import rip.nerd.kitsunenet.util.toSafeString

🚀 Szybki start

val redactor = KNETSensitiveDataRedactor.default()

// Redact request
val safeRequest = redactor.redactRequest(request)
println(safeRequest.headers)
// {"Authorization": "[REDACTED]", "Content-Type": "application/json"}

// Redact response body
val safeBody = redactor.redactBody(response.bodyString)
println(safeBody)
// {"password": "[REDACTED]", "name": "John", "email": "john@example.com"}

// Redact URL
val safeUrl = redactor.redactUrl("https://api.com/login?api_key=secret123")
// https://api.com/login?api_key=[REDACTED]

🛡️ Co jest domyślnie chronione

Headers

JSON Fields

Patterns

🔧 Custom konfiguracja

val redactor = KNETSensitiveDataRedactor.builder()
    // Dodaj własne headery
    .addSensitiveHeader("X-Secret-Key", "X-Internal-Token")

    // Dodaj własne pola JSON
    .addSensitiveField("ssn", "social_security", "tax_id")

    // Dodaj własne query params
    .addSensitiveQueryParam("secret", "key")

    // Dodaj własne wzorce regex
    .addPattern("polish_pesel", Regex("\\d{11}"))
    .addPattern("polish_nip", Regex("\\d{3}-\\d{3}-\\d{2}-\\d{2}"))

    // Custom wartość zastępcza
    .redactedValue("***HIDDEN***")

    // Pokaż część wartości
    .showPartial(4)  // "secr***HIDDEN***"

    .build()

📋 Presets

// Domyślny - popularne wzorce
val redactor = KNETSensitiveDataRedactor.default()

// Minimalny - tylko auth headers
val minimal = KNETSensitiveDataRedactor.minimal()

// Strict - wszystkie możliwe dane osobowe
val strict = KNETSensitiveDataRedactor.strict()
// Dodatkowo: telefony, emaile, adresy IP

// PCI Compliant - karty kredytowe
val pci = KNETSensitiveDataRedactor.pciCompliant()
// Visa, MasterCard, Amex, CVV, expiry

📝 Extensions

// Bezpieczne logowanie requestu
println(request.toSafeString())
// POST https://api.com/login
// Headers: {Authorization: [REDACTED]}
// Body: {"password": "[REDACTED]", "username": "john"}

// Bezpieczne logowanie response
println(response.toSafeString())
// 200 OK
// Body: {"token": "[REDACTED]", "user": {...}}

// Z custom redactorem
println(request.toSafeString(myCustomRedactor))

💡 Praktyczne przykłady

Bezpieczny logging interceptor

class SafeLoggingInterceptor(
    private val redactor: KNETSensitiveDataRedactor = KNETSensitiveDataRedactor.default()
) : KNETInterceptor {

    override suspend fun intercept(chain: KNETInterceptor.Chain): KNETResponse {
        val request = chain.request

        // Loguj bezpiecznie
        Log.d("HTTP", "→ ${request.toSafeString(redactor)}")

        val response = chain.proceed(request)

        Log.d("HTTP", "← ${response.toSafeString(redactor)}")

        return response
    }
}

Export logów do zewnętrznego systemu

class RequestLogger(
    private val analytics: Analytics,
    private val redactor: KNETSensitiveDataRedactor = KNETSensitiveDataRedactor.strict()
) {
    fun logRequest(request: KNETRequest, response: KNETResponse) {
        val safeRequest = redactor.redactRequest(request)
        val safeResponse = redactor.redactResponse(response)

        analytics.log("http_request", mapOf(
            "url" to redactor.redactUrl(safeRequest.url),
            "method" to safeRequest.method,
            "status" to safeResponse.statusCode,
            "headers" to safeRequest.headers,
            "body" to safeResponse.bodyString.take(1000)
        ))
    }
}

PCI Compliance dla płatności

class PaymentLogger {
    private val redactor = KNETSensitiveDataRedactor.pciCompliant()

    fun logPayment(request: KNETRequest) {
        // Numery kart są automatycznie ukrywane
        val safeBody = redactor.redactBody(request.data.toString())

        // "4111111111111111" → "[REDACTED]"
        // "cvv: 123" → "cvv: [REDACTED]"

        auditLog.write(safeBody)
    }
}

Debug z częściowym pokazywaniem

val debugRedactor = KNETSensitiveDataRedactor.builder()
    .showPartial(4)  // Pokaż pierwsze 4 znaki
    .redactedValue("...")
    .build()

// "secret_token_12345" → "secr..."
// Przydatne do debugowania (widzisz początek tokena)

🔗 API Reference

KNETSensitiveDataRedactor

MetodaOpis
redactRequest(request)Redactuje cały request
redactResponse(response)Redactuje cały response
redactHeaders(headers)Redactuje headery
redactQueryParams(params)Redactuje query params
redactUrl(url)Redactuje URL
redactBody(body)Redactuje JSON body
redactMap(map)Redactuje mapę

Builder

MetodaOpis
addSensitiveHeader(...)Dodaje headery do redakcji
addSensitiveField(...)Dodaje pola JSON
addSensitiveQueryParam(...)Dodaje query params
addPattern(name, regex)Dodaje wzorzec regex
redactedValue(value)Ustawia wartość zastępczą
showPartial(length)Pokazuje część wartości
clearDefaults()Czyści domyślne reguły

📚 Zobacz też