RNCryptor不能使用JSON字符串
这里是我的方法,使用RNCryptor来加密/解密我发送给Web服务的JSON字符串。 我正在使用静态IV变量,这可能是不好的做法,但请不要专注于此。 这是我如何做到的:
注意:我使用的是Matt Gallagher的NSData + Base64类别(位于页面底部)
-(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;
}
当我使用像hello world
这样的字符串时,它工作正常。 当我使用像{"username":"developer","password":"abcdefG*12"}
这样的字符串时{"username":"developer","password":"abcdefG*12"}
我想它与编码有关,但我真的知道该怎么用。
当我加密该字符串时,我得到一个base64字符串,当我尝试解密时,我得到一个空字符串。
UPDATE
它看起来像是失败了,因为:
在json字符串中。 什么是weirder,它只会失败,字符串是JSON格式,我认为这是因为:
我首先尝试,但如果我打破了任何JSON要求进一步调查,
的{
}
s它停止工作。 它与RNEncryptor
一起工作,所以我不确定我做错了什么。 无论如何,我认为我们可能会重新设计目前的流量
更新2
这是我调用这些方法的地方:
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:
您没有收集由addData:
返回的数据addData:
。 该引擎会随时加密/解密,因此您无需在内存中保存整个明文和密文。 它不累积数据,除非它必须(为了填充的原因)。 我怀疑正在运行的测试的长度与没有测试的长度不同。
你是正确的,使用固定的IV是不好的做法。 如果您使用相同的IV并键入多条消息,则攻击者可能通过比较密文来恢复部分消息。 如果您在没有随机IV和HMAC的情况下使用AES-CBC,则您的AES在几个方面不安全。 这就是RNCryptor的目的所在,以及数据格式为何如此。
@jbtule是正确的,我并不特别指出人们直接使用引擎并且没有大量记录它,但是使用它并没有问题,并且我可以更好地记录它以支持它。 也就是说,发动机本身非常简单, 我只是将它创建为在加密器和解密器之间共享代码的一种方式。 如果您要绕过其提供的大部分安全性,则没有太多理由使用RNCryptor。 对于上面的代码,只需调用CCCrypt()
就可以简单得多。