我正在使用以下代码来混淆我的测试应用的密码。
- (NSString *)obfuscate:(NSString *)string withKey:(NSString *)key
{
// Create data object from the string
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
// Get pointer to data to obfuscate
char *dataPtr = (char *) [data bytes];
// Get pointer to key data
char *keyData = (char *) [[key dataUsingEncoding:NSUTF8StringEncoding] bytes];
// Points to each char in sequence in the key
char *keyPtr = keyData;
int keyIndex = 0;
// For each character in data, xor with current value in key
for (int x = 0; x < [data length]; x++)
{
// Replace current character in data with
// current character xor'd with current key value.
// Bump each pointer to the next character
*dataPtr = *dataPtr++ ^ *keyPtr++;
// If at end of key data, reset count and
// set key pointer back to start of key value
if (++keyIndex == [key length])
keyIndex = 0, keyPtr = keyData;
}
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
这就像一个带有所有琴弦的魅力,但我遇到了一个比较以下结果的问题
NSLog([[self obfuscate:@"0000", @"maki"]); //Returns 0]<W
NSLog([[self obfuscate:@"0809", @"maki"]); //Returns 0]<W
正如您所看到的,带有数字的两个字符串虽然不同但返回相同的结果!我附加的代码出了什么问题导致这两个数字的结果相同?
另一个例子:
NSLog([self obfuscate:@"8000" withKey:@"maki"]); //Returns 8U4_
NSLog([self obfuscate:@"8290" withKey:@"maki"]); //Returns 8U4_ as well
我可能误解了混淆的概念,但我的印象是每个唯一的字符串都会返回一个独特的混淆字符串!
请帮我解决这个错误/故障 代码来源:http://iosdevelopertips.com/cocoa/obfuscation-encryption-of-string-nsstring.html
答案 0 :(得分:4)
问题是你的最后一行。使用原始未修改的data
对象创建新字符串。
您需要从修改后的NSData
字节创建一个新的dataPtr
对象。
NSData *newData = [NSData dataWithBytes:dataPtr length:data.length];
return [[NSString alloc] initWithData:newData encoding:NSUTF8StringEncoding];
但是你有一些更大的问题。
bytes
的调用返回对NSData
对象中字节的常量只读引用。你不应该修改那些数据。答案 1 :(得分:2)
您选择的模糊算法基于XOR
数据和“键”值。一般来说,这不是很强。此外,由于XOR
是对称的,因此结果很容易产生重复。
虽然您的实现目前已被破坏,但修复它对防止算法为不同数据生成相同结果没有太大帮助:构建生成相同混淆字符串的键/数据对相对简单 - 例如,
[self obfuscate:@"0123" withKey:@"vwxy"]
[self obfuscate:@"pqrs" withKey:@"6789"]
将产生相同的结果"FFJJ"
,即使字符串和键看起来完全不同。
如果您希望以加密方式强大地“混淆”字符串,请使用salted secure hash算法:即使是稍微不同的字符串,它也会产生非常不同的结果。