Objective c CC_SHA256为不同的输入生成相同的输出

Objective c CC_SHA256为不同的输入生成相同的输出,objective-c,sha256,Objective C,Sha256,下面是一个基本的CC_SHA256示例: -(void)hash:(NSData *)input { NSLog(@"Input is %@", [self NSDataToHex:input]); NSMutableData *result = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; CC_SHA256(CFBridgingRetain(input), input.length, result.

下面是一个基本的CC_SHA256示例:

-(void)hash:(NSData *)input
{
    NSLog(@"Input is %@", [self NSDataToHex:input]);

    NSMutableData *result = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];

    CC_SHA256(CFBridgingRetain(input), input.length, result.mutableBytes);

    NSLog(@"RESULT is %@", result);
}
该算法似乎工作正常。一个小测试:

NSString* str = @"abcde";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

[self hash:data];

NSString* str2 = @"fghijk";
NSData* data2 = [str2 dataUsingEncoding:NSUTF8StringEncoding];

[self hash:data2];
提供以下输出:

Input is 6162636465
RESULT is <91681b5f 162cf494 238e5cac 0debbe92 c3ede9bf 4bcc7e79 845b774f b33e99f7>
Input is 666768696A6B
RESULT is <cccf7b6f 9acb96ae 84e9852b 1a753825 d6750555 57175c78 f86cf5fb bb3cfca7>
Input is 6162636465
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570>
Input is 666768696A6B
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570>
输入为6162636465
结果是
输入为666768696A6B
结果是
现在,如果我将第二个参数(input.length)更改为3,我将得到以下输出:

Input is 6162636465
RESULT is <91681b5f 162cf494 238e5cac 0debbe92 c3ede9bf 4bcc7e79 845b774f b33e99f7>
Input is 666768696A6B
RESULT is <cccf7b6f 9acb96ae 84e9852b 1a753825 d6750555 57175c78 f86cf5fb bb3cfca7>
Input is 6162636465
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570>
Input is 666768696A6B
RESULT is <5e83c408 f722bb9a 9f602d85 c186bcb1 ebb8fa2f 0df2cc08 5eaf2522 92b01570>
输入为6162636465
结果是
输入为666768696A6B
结果是
这些散列是相同的。我希望CC_SHA256算法只对输入的前3个字符进行散列,但显然,它不是这样工作的。此外,如果我重新启动模拟器,生成的哈希值与第一次不同(但仍然相等)

为什么会发生这种行为?对于这个问题,请不要给出(明显的)解决方法。我真的很想知道为什么算法会这样做。

SHA(以及任何哈希算法)应该是确定性的,因此在不同的启动之间它会有所不同,这一事实表明您很可能错误地使用了它

我的猜测是,如果您只是传入输入的引用,那么您正在散列一些与
NSData
相关的内部数据,因此前几个字节是相同的,但在lanches之间是不同的

查看以下问题之一()了解在iOS上正确实现SHA-256

(以上答案):

-(NSString*)sha256HashFor:(NSString*)输入
{   
const char*str=[输入UTF8String];
无符号字符结果[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(str,strlen(str),结果);
NSMutableString*ret=[NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];

对于(int i=0;我认为您传递的散列参数不正确。请尝试传递
input.bytes
而不是
CfBrigingRetain(input)
。我的猜测是,如果你只是传入
输入的引用
,你正在散列一些与
NSData
相关的内部数据,因此前几个字节在lanches之间是相同和不同的。SHA应该是确定的,因此,对于相同的输入,它正在改变这一事实意味着你在错误地使用它。你似乎是ri嗯。我还认为随机性很奇怪。你能添加你的答案,这样我就可以把它标记为正确吗?但不幸的是,在实际应用程序中,输入字符串要长得多(64个字符),输入大小设置为32。两者(完全不同)字符串仍然给出相同的散列值…感谢您的回答。然而,对于一个大字符串,即使对象的前32个字节看起来也是相同的,因为两个长度为64的不同字符串都给出相同的散列值,这很奇怪