Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 监督厅/目标C:SHA-1和Base64_Iphone_Objective C_Hash_Base64_Sha1 - Fatal编程技术网

Iphone 监督厅/目标C:SHA-1和Base64

Iphone 监督厅/目标C:SHA-1和Base64,iphone,objective-c,hash,base64,sha1,Iphone,Objective C,Hash,Base64,Sha1,我必须将短语“1234”转换为其SHA-1哈希的Base64编码 我想要:'1234'=cRDtpNCeBiql5KOQsKVyrA0sAiA= (此示例与服务器通信相关) 但当我在这些站点上检查它或在我的XCode项目中使用我的方法时,结果总是不同的: 1234 在SHA-1之后() 7110eda4d09e062aa5e4a390b0a572ac0d2c0220 在Base64()之后 NZEXMGVKYTRKMDLLDYYYWE1ZTRHMZKWYJBHNTCYWMWZDJJMDIYMA=

我必须将短语“1234”转换为其SHA-1哈希的Base64编码

我想要:'1234'=cRDtpNCeBiql5KOQsKVyrA0sAiA= (此示例与服务器通信相关)

但当我在这些站点上检查它或在我的XCode项目中使用我的方法时,结果总是不同的:

1234

在SHA-1之后() 7110eda4d09e062aa5e4a390b0a572ac0d2c0220

在Base64()之后 NZEXMGVKYTRKMDLLDYYYWE1ZTRHMZKWYJBHNTCYWMWZDJJMDIYMA==

这是我的SHA-1功能:

- (NSString *)sha1:(NSString *)str {
    const char *cStr = [str UTF8String];
    unsigned char result[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(cStr, strlen(cStr), result);
    NSString *s = [NSString  stringWithFormat:
                   @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
                   result[0], result[1], result[2], result[3], result[4],
                   result[5], result[6], result[7],
                   result[8], result[9], result[10], result[11], result[12],
                   result[13], result[14], result[15],
                   result[16], result[17], result[18], result[19]
                   ];

    return [s lowercaseString];
}
对于Base64,我使用一个此类:

这是SHA-1和Base64的呼叫:

 NSString *pwHash =[self sha1:self._txtFieldPW.text]; //In my case '1234'
 NSLog(@"Hash: %@",pwHash); //7110eda4d09e062aa5e4a390b0a572ac0d2c0220
 //7110eda4d09e062aa5e4a390b0a572ac0d2c0220
 NSData *pwHashData = [[NSData alloc]initWithData:[pwHash dataUsingEncoding:1]];
 NSString *base64 = [pwHashData base64Encoding];
 NSLog(@"Base64: %@",base64); 
 //NzExMGVkYTRkMDllMDYyYWE1ZTRhMzkwYjBhNTcyYWMwZDJjMDIyMA==

出什么问题了?

哈希是一个二进制值。“cRDtpNCeBiql5KOQsKVyrA0sAiA=”字符串是哈希的二进制值编码的结果。同时,“nzexmgvkytrkmdllmdyyywe1ztrhmzkwyjbhntcywmwzdjjmdiyma==”字符串是哈希十六进制表示形式上Base64转换的结果

这有意义吗?所以你有一个SHA1散列,一个20字节的数组:{0x71,0x10,…}。您可以按原样对内存块进行Base64编码。或者,您可以将每个字节转换为两个小写十六进制数字,然后得到ASCII字符串“7110eda4d09e062aa5e4a390b0a572ac0d2c0220”。如果对该字符串应用Base64编码,而不是原始哈希字节,则会得到Base64值“NzExMGV…”

编辑,具有额外的二进制优点:重新格式化第二个代码段,如下所示:

unsigned char result[CC_SHA1_DIGEST_LENGTH]; 
const char *cStr = [self._txtFieldPW.text UTF8String];
CC_SHA1(cStr, strlen(cStr), result); //Now result contains the hash

//Wrap the result in a NSData object
NSData *pwHashData = [[NSData alloc] initWithBytes:result length: sizeof result];  
//And take Base64 of that
NSString *base64 = [pwHashData base64Encoding];  
NSLog(@"Base64: %@",base64); 
并摆脱
sha1
方法。一旦删除了庞大的
stringWithFormat
调用,它将是一个两行程序。如果你真的想要日志中的十六进制散列,请随意;但不要将十六进制字符串视为散列的真实值,因为它不是


除非您使用的是ARC,否则不要忘记在之后释放
NSData
对象。

谢谢您的回答,但我想我还没有得到它。。当我有一个带有“7110eda4d09e062aa5e4a390b0a572ac0d2c0220”的NSString时。我如何将其转换为“cRDtpNCeBiql5KOQsKVyrA0sAiA=“”?与其从十六进制字符串返回到二进制,不如首先尝试以二进制形式获取哈希值。请将代码粘贴到计算散列的位置。谢谢。现在发布上面调用
sha1
的函数中的代码。我要说的是,我想重新格式化您的代码,将二进制哈希块(结果数组)直接传递给Base64编码器。另外,在这里,你应该在问题中张贴代码,而不是作为答案。这是一个问答网站,不是论坛。非常感谢你对我的帮助!我浪费了一整天的时间想弄明白这件事。谢谢:)