NSCharacterSet URLHostAllowedCharacterSet nicht ersetzen ' + ' - Zeichen?

Ich bin kämpfen, um Sie zu übertragen langen verschlüsselte strings über Netzwerk-und Sie kommen richtig auf dem server. Zum Beispiel habe ich diese verschlüsselte Zeichenfolge auf dem client:

wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hquwek0vyclefpgwfr/sBTES1A4rPV6eyp9nzEEU9uKkiFSTdP+SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0irwone5uik+VlpR41kETmznXa4+gELmf53r7oayRkkffnIPDmpO+WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiieim3zojw/sw==

Wie Sie sehen können, hat es ein paar Charaktere, nicht die übertragung über das Netzwerk, ohne eine URL-Codierung (+ und /, vor allem). Ich bin mir nicht ganz sicher, ob es könnte auch andere Zeichen, die entstehen können, in anderen Situationen, so möchte ich sicherstellen, dass meine Lösung ist "universell" zu korrigieren. Ich bin mit dieser Zeile:

NSString *escapedString = [cipherString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];

welche ich gefunden habe, in einem hoch bewertet Antwort.

Allerdings hab ich noch Probleme mit der Entschlüsselung dieser auf der server-Seite, also druckte ich die Ergebnisse auf dem client unmittelbar vor dem senden, und ich sehe das:

wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hquwek0vyclefpgwfr%2FsBTES1A4rPV6eyp9nzEEU9uKkiFSTdp+SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0irwone5uik+VlpR41kETmznXa4+gELmf53r7oayRkkffnIPDmpO+WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiieim3zojw%2Fsw==

Warum sind die ' + ' - Zeichen immer noch da? Bin ich mit den falschen erlaubt Zeichensatz? Welchen Zeichensatz sollte ich verwenden, um sicherzustellen, dass ich korrekt entkommen, alle problematischen Zeichen?

Falls es hilft, hier ist der code, den ich verwende, um zu verschlüsseln, die nur-text-string. Wenn es fertig ist, ich die base64-Kodierung der Ergebnisse vor dem senden über das Netzwerk:

- (NSData *)phpEncryptCleartext : (NSData *)cleartext
{
    NSData *cleartextPadded = [self phpPadData:cleartext];

    CCCryptorStatus ccStatus        = kCCSuccess;
    size_t          cryptBytes      = 0;    //Number of bytes moved to buffer.
    NSMutableData  *cipherTextData  = [NSMutableData dataWithLength:cleartextPadded.length];

    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithmAES128,
                       0,
                       _sessionKey.bytes,
                       kCCKeySizeAES128,
                       _iv.bytes,
                       cleartextPadded.bytes,
                       cleartextPadded.length,
                       cipherTextData.mutableBytes,
                       cipherTextData.length,
                       &cryptBytes);

    if (ccStatus == kCCSuccess) {
        cipherTextData.length = cryptBytes;
    }
    else {
        NSLog(@"kEncryptionError code: %d", ccStatus); //Add error handling
        cipherTextData = nil;
    }

    return cipherTextData;
}

Vielen Dank für jeden Rat!

  • Ich habe nicht geprüft, die Doku aber wenn, wenn nicht, entkommen die + (die aus meiner POV wäre ok) können Sie feuern Sie Ihre eigene Zeichenfolge-Ersatz, dass änderungen plus die äquivalente kaufmännische und-Zeichen.
  • Vielleicht sollten Sie versuchen URLFragmentAllowedCharacterSet?
  • URLFragmentAllowedCharacterSet andere Probleme verursacht. Ich kann ganz einfach meine eigene Zeichenfolge-Ersatz, aber ich bin besorgt über die nur Brände zu löschen, wie Sie entstehen, denn dann kann ich nicht völlig überzeugt, dass ich gesehen habe, alle möglichen problematischen Zeichen. Ich gehe davon aus, dass dies wurde oft angesprochen, und bin der Hoffnung, dass es eine eingebaute Methode, Griff Sie zuverlässig. Für jetzt, obwohl, wahrscheinlich werde ich haben, um es, wie Sie vorschlagen. Danke!
  • Was meinst du mit "Zeichen wird nicht übertragen über das Netzwerk"? Welches Protokoll? Es gibt nichts inhärent in der Netzwerk-Kommunikation, die verhindert, dass irgendein Zeichen von übertragung. Da haben Sie base64-kodiert Ihre Daten, das sollte ziemlich sicher in den meisten Kontexten. Das ist der Punkt, der base64.
  • Ich habe versucht, Tauchen in diesem aber auch immer die Liste der Zeichen gebunden an die charsets scheint schwierig zu sein (aka unmöglich für mich, um das herauszufinden). Wie ich sage: Wenn es gut werden, Mach es selbst 😉
  • der Inhalt einer POST übermittelt alle Daten. Es gibt nicht einmal eine Notwendigkeit, um die Base64-Kodierung der Daten. Aber wenn du das postest als eine form, dann sind die Daten müssen zu entkommen, einige Zeichen.
  • Sie haben, was aussieht wie die Base64-kodierten Daten, die Zeichen in Base64-Kodierung: A–Z, A–z, 0-9, /, + und = für die Polsterung. Kann es sein, Zeilenvorschub-Zeichen je nach Base64-encoding-Optionen.
  • Ich bin mit HTTP. Das problem ist, dass Zeichen wie + bekommen, interpretiert auf dem server mit Ihren unescaped Wert, so ein + wird interpretiert als Raum.
  • Danke, @Zaph. Wissen, das hilft viel, da ich dann nur zu entkommen müssen drei Zeichen, und die = scheint zu empfangen, ohne ein problem.

InformationsquelleAutor Alex | 2015-04-22
Schreibe einen Kommentar