2016-06-14 4 views
3

Ich habe mehrere ähnliche JSON-Strukturen, die ich in eine SQL-Tabelle für Protokollierungszwecke schreiben möchte. Einige der Felder im JSON enthalten jedoch vertrauliche Informationen, die ich teilweise maskieren möchte, sodass der vollständige Wert im Protokoll nicht sichtbar ist. HierWie empfindliche Werte in JSON für Protokollierungszwecke zu maskieren

ist ein Beispiel für eine der JSON Strukturen:

{ 
    "Vault": 1, 
    "Transaction": { 
    "gateway": { 
     "Login": "Nick", 
     "Password": "Password" 
    }, 
    "credit_card": { 
     "number": "4111111111111" 
    } 
    } 
} 

In diesem Fall ich versuche, die 4111 Kreditkartennummer zu ändern, so dass es wie 4xxx1111 im JSON erscheint. Ich benutze Newtonsoft und habe das JSON in eine JObject deserialisiert, aber ich bin fest, wie man den Wert maskiert. Ich denke, der Hinweis ist etwas mit JToken, aber habe es noch nicht herausgefunden. Ich möchte die Lösung so allgemein wie möglich machen, damit sie mit jeder JSON-Struktur funktioniert, die ich abmelden muss.

Jede Hilfe wäre willkommen.

+0

hat die Maskierung während der Deserialisierung zu tun? Warum maskieren Sie es nicht gleich danach? –

+0

Ihre Anforderungen sind ein wenig unklar. Ist das wonach Sie suchen? [Wie kann ich ausgewählte Eigenschaften beim Serialisieren meiner Objekte verschlüsseln?] (Https://stackoverflow.com/questions/29196809). Oder ist es das? [Wie ändert man die Json-Serialisierung von nur einem Feld mit Json.net?](https://Stackoverflow.com/questions/21182758). – dbc

+0

Dies muss bei der Deserialisierung überhaupt nicht gemacht werden. Eigentlich habe ich es in ein JObject deserialisiert. Ich denke, der Hinweis ist etwas mit JToken, aber ich habe es noch nicht herausgefunden. Die Absicht hier ist, dass ich das gesamte Paket nehme und es schließlich in eine SQL-Tabelle einlogge. Aber ich kann nicht einfach die ganze Kreditkartennummer reinschieben. Es ist ein CYA "Nein, das ist was du mir geschickt hast" Art von Log.Außerdem ist dies nur ein Beispiel für eine der Strukturen, andere sind sehr sehr ähnlich, aber nicht ganz gleich, also versuche ich, die Dinge so allgemein wie möglich zu halten. –

Antwort

3

Hier ist der Ansatz, den ich glaube, ich nehmen würde:

  1. eine Hilfsmethode machen, die einen String-Wert und verschleiern sie in der Art und Weise für die Anmeldung benötigen Sie nehmen können. Vielleicht so etwas wie dies, zum Beispiel:

    public static string Obscure(string s) 
    { 
        if (string.IsNullOrEmpty(s)) return s; 
        int len = s.Length; 
        int leftLen = len > 4 ? 1 : 0; 
        int rightLen = len > 6 ? Math.Min((len - 6)/2, 4) : 0; 
        return s.Substring(0, leftLen) + 
          new string('*', len - leftLen - rightLen) + 
          s.Substring(len - rightLen); 
    } 
    
  2. ein weiteres Hilfsmethode Stellen, die eine JToken und eine Liste der JSONPath Ausdrücke akzeptieren kann. Passen Sie bei dieser Methode jeden Pfad an den Inhalt des Tokens an, indem Sie SelectTokens verwenden. Verwenden Sie für jedes gefundene Match die erste Hilfsmethode, um den sensiblen Wert durch eine verdeckte Version zu ersetzen.

    public static void ObscureMatchingValues(JToken token, IEnumerable<string> jsonPaths) 
    { 
        foreach (string path in jsonPaths) 
        { 
         foreach (JToken match in token.SelectTokens(path)) 
         { 
          match.Replace(new JValue(Obscure(match.ToString()))); 
         } 
        } 
    } 
    
  3. schließlich eine Liste der JSONPath Ausdrücke für die Werte zusammenstellen, die Sie über alle JSON Stellen Sie erhalten erwarten verschleiern wollen. Von Ihrem Beispiel JSON oben, ich denke, Sie möchten Password wo immer es auftritt und number ob es innerhalb credit_card auftritt verdecken. Als JSONPath ausgedrückt, wären dies $..Password bzw. $..credit_card.number. (Beachten Sie, dass JSONPath-Ausdrücke in Json.Net die Groß-/Kleinschreibung beachten.) Nehmen Sie diese Liste und fügen Sie sie irgendwo in eine Konfigurationseinstellung ein, damit Sie sie bei Bedarf leicht ändern können.

  4. Nun, wenn Sie einige JSON abmelden möchten, tun gerade dies:

    JToken token = JToken.Parse(json); 
    string[] jsonPaths = YourConfigSettings.GetJsonPathsToObscure(); 
    ObscureMatchingValues(token, jsonPaths); 
    YourLogger.Log(token.ToString(Formatting.None)); 
    

Geige Demo: https://dotnetfiddle.net/dGPyJF