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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur escape-Zeichen
stringByAddingPercentEncodingWithAllowedCharacters:
Nutzen wir die folgenden Zeichensätze, eigentlich das Zeichen nicht enthalten in den sets:
Oder erstellen Sie Ihre eigenen characterset nur mit den Zeichen, die Sie brauchen, um zu entkommen.
Erstellen einer characterset kombinieren alle der oben genannten:
Erstellen, die eine Base64 -
Im Fall von Base64 characterset:
Hinweis:
stringByAddingPercentEncodingWithAllowedCharacters
wird auch encode UTF-8-Zeichen erfordern Codierung.Beispiel, um zu überprüfen, die Zeichen in dem Satz:
NSCharacterSet
mit allen Apple-Kodierungen. Ich erinnere mich nicht genau, wie ich bestimmt die Zeichen, die wohl empirisch (versuche die Menge aller ASCII-Zeichen).URLQueryAllowedCharacterSet
findet die+
Charakter. Check it out, es ist in dem Satz.+
ist in derURLQueryAllowedCharacterSet
die Antwort zeigt eigentlich die Zeichen, die nicht in der Charakter-sets, die ist, was wirklich interessant ist. Ich habe die update-die Antwort auf mehr klar, dass die Charaktere vorgestellt werden, sind nicht in den sets.