2013-01-10 3 views
7

Hier sind meine Methoden, RNCryptor zu verwenden, um eine JSON-Zeichenfolge zu verschlüsseln/entschlüsseln, die ich an den Webdienst sende. Ich verwende eine statische IV-Variable, die eine schlechte Übung sein kann, aber bitte konzentrieren Sie sich nicht darauf. Hier ist, wie ich es so mache:RNCryptor arbeitet nicht mit JSON Zeichenfolge

Hinweis: Ich bin mit Matt Gallagher NSData + Base64 Kategorie here gefunden (am Ende der Seite)

-(NSString*)encryptString:(NSString*)plaintext withKey:(NSString*)key error:(NSError**)error{ 
    NSData *data = [plaintext dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *encryptionKey = [NSData dataFromBase64String:key]; 
    NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV]; 

    RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCEncrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error]; 
    [engine addData:data error:error]; 
    NSData *encryptedData = [engine finishWithError:error]; 

    NSString *based64Encrypted = [encryptedData base64EncodedString]; 
    NSLog(@"Encrytped: %@", based64Encrypted); 
    return based64Encrypted; 
} 
-(NSString*) decryptString:(NSString*)cipherText withKey:(NSString*)key error:(NSError**)error;{ 
    NSData *data = [NSData dataFromBase64String:cipherText]; 
    NSData *encryptionKey = [NSData dataFromBase64String:key]; 
    NSData *IV = [NSData dataFromBase64String:ENCRYPTION_IV]; 

    RNCryptorEngine *engine = [[RNCryptorEngine alloc] initWithOperation:kCCDecrypt settings:kRNCryptorAES256Settings key:encryptionKey IV:IV error:error]; 
    [engine addData:data error:error]; 
    NSData *decryptedData = [engine finishWithError:error]; 
    NSString *decryptedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; 
    NSLog(@"Decrypted: %@", decryptedString); 
    return decryptedString; 
} 

Wenn ich eine Zeichenfolge wie hello world verwenden, es funktioniert . Wenn ich eine Zeichenfolge wie {"username":"developer","password":"abcdefG*12"} verwende stelle ich mir vor, dass es etwas mit der Codierung zu tun hat, aber ich weiß wirklich, was zu verwenden ist.

Wenn ich diese Zeichenfolge verschlüsseln bekomme ich eine Base64-Zeichenfolge und wenn ich versuche zu entschlüsseln, bekomme ich eine leere Zeichenfolge.

UPDATE

Es sieht aus wie es wegen der : im JSON-String versagt wird. Was ist seltsamer ist es schlägt nur mit der Zeichenfolge ist in Json-Format, ich dachte, es war die : Ursache habe ich zuerst versucht, aber bei weiterer Untersuchung, wenn ich eine der JSON-Anforderungen , 's ' s } 's gestoppt wurde gestoppt Arbeiten. Es funktioniert mit der RNEncryptor aber so bin ich mir nicht sicher, was ich falsch mache. So oder so, ich denke, wir den Stromfluss neu gestalten kann

UPDATE 2

Hier ist, wo ich diese Methoden nenne:

NSDictionary *credentials = @{@"username":@"developer",@"password":@"abcdefG*12"}; 
NSString *jsonString = [ credentials JSONStringWithOptions:JKSerializeOptionNone error:&error]; 
NSLog(@"json string: %@", jsonString); //OUTPUTS: {"username":"developer","password":"abcdefG*12"} 
CCGEncryption *encryptionObject = [[CCGEncryption alloc] init]; //THIS IS THE OBJECT WHERE THE encrypt/decrypt methods are 

NSString *encrypted = [encryptionObject encryptString:jsonString withKey:ENCRYPTION_KEY error:&error]; 
if(error){ 
    NSLog(@"Error:%@", error); //NO ERROR 
} 
NSString *decrypted = [encryptionObject decryptString:encrypted withKey:ENCRYPTION_KEY error:&error]; 
if(error){ 
    NSLog(@"Error:%@", error); //NO ERROR 
} 
NSLog(@"decrypted: %@", decrypted); //OUTPUT: decrypted: 
+0

Wenn Sie sagen: "Ich kodiere diese Zeichenfolge ich bekomme eine Base64-Zeichenfolge und wenn ich versuche zu dekodieren, bekomme ich einen Nullwert." Bedeutst du verschlüsseln und entschlüsseln? Aus Ihrem geposteten Code sehe ich, dass Ihr Klartext die UTF8-Kodierung verwendet und Ihr Chiffretext Base64 verwendet, keiner von diesen sollte Probleme mit Doppelpunkten haben. Wenn Ihre Entschlüsselungsfunktion 'null' zurückgibt, wird wahrscheinlich ein Fehlerwert zurückgegeben. Was ist es wert? – jbtule

+0

@jbtule Ich habe den Code hinzugefügt, wo ich diese Methoden verwende.Ich benutze JSONKit, um das NSDictionary zu NSString – mkral

+0

@jbtule zu serialisieren und ja, ich meine verschlüsseln/entschlüsseln Ich habe den Beitrag bearbeitet – mkral

Antwort

3

Sie sind nicht die Datenerfassung von addData: zurückgegeben. Die Engine verschlüsselt/entschlüsselt, so dass Sie nicht den gesamten Klartext und Geheimtext im Speicher halten müssen. Es akkumuliert die Daten nicht, es sei denn, es muss (aus Gründen der Auffüllung). Ich vermute, dass die Tests, die funktionieren, von unterschiedlicher Länge sind als die, die nicht funktionieren.

Sie haben Recht, dass die Verwendung einer festen IV ist eine schlechte Praxis. Wenn Sie dieselbe IV und denselben Schlüssel in mehreren Nachrichten verwenden, können Angreifer Teile Ihrer Nachrichten wiederherstellen, indem Sie die verschlüsselten Texte vergleichen. Wenn Sie AES-CBC ohne zufällige IV und HMAC verwenden, ist Ihr AES auf verschiedene Arten unsicher. Das ist das Problem, dass RNCryptor entwickelt wurde und warum das Datenformat so aussieht wie es aussieht.

@jbtule ist richtig, dass ich nicht speziell für Leute, die die Maschine direkt zu verwenden und nicht stark dokumentiert haben, aber es gibt kein Problem mit der Verwendung, und ich kann es besser dokumentieren, um das zu unterstützen. Das heißt, der Motor selbst ist wahnsinnig einfach; Ich habe es gerade erstellt, um Code zwischen dem Verschlüssler und dem Entschlüsseler zu teilen. Es gibt keinen Grund, RNCryptor zu verwenden, wenn Sie die meisten Sicherheitsfunktionen umgehen möchten. Für den obigen Code wäre es viel einfacher, nur den One-Shot CCCrypt() zu nennen.

+0

Dank Rob für die Erklärung sehr deutlich. Ich werde mit unserem Backend-Entwickler über die Implementierung mit Random IV sprechen. Eine Frage, die ich hatte, ist das Datenformat, in dem Sie eine Art Standard verwenden? Irgendwann werden wir auf Android umziehen und wollen es jetzt machen. – mkral

+0

Es gibt kein einfaches Standardformat, das eine IV, Salze und ein HMAC enthalten kann, also musste ich ein neues rollen. Das Aescrypt-Format ist nahe, aber Sie können keine Zufallsalze bereitstellen (und sie verwenden kein Standard-PBKDF). Das einzige Standardformat, das ich gefunden habe, das AES korrekt kodieren kann, ist CMS, aber es ist * viel * komplizierter und hauptsächlich für zertifikats-signierte Nachrichten ausgelegt, nicht für symmetrische Verschlüsselung. Ich suche aktiv nach einem Format zur Unterstützung, aber es muss sicher sein. Der bekannteste "Standard" ist OpenSSL, aber das AES-Format ist auf mehrere Arten aufgeteilt. –

+0

Ok toll, danke für die Erklärung! – mkral

Verwandte Themen