有关CC_SHA256 objective-c的一些信息

use*_*683 3 objective-c sha256

对于一个新项目,我需要使用SHA256散列NSString.我使用了以下代码:

unsigned char hashedChars[32];
NSString *inputString;
inputString = [NSString stringWithFormat:@"hello"];
NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA256(inputData.bytes, inputData.length, hashedChars);
Run Code Online (Sandbox Code Playgroud)

我在stackoverflow上找到了这段代码.我真的没有得到这些代码所做的所有事情是关于代码的一些问题:

1.CC_SHA256会产生哈希值,但这个哈希值会再次存储在inputData中吗?我的意思是我可以做这样的事情:

NSString *string=CC_SHA256(..) //of course you can't put it directly in a NSString, but you get the point
Run Code Online (Sandbox Code Playgroud)

2.最后哈希必须是十六进制字符串,但CC_SHA256输出的类型是什么(UTF-8 ??)?

3. CC_SHA256的第一个参数为什么我必须在末尾放置字节并且"inputData"足够了?

4.需要字符串的长度(第二个参数)?

5.最后一个参数对我没有任何意义,有人可以解释一下,为什么hashedChars必须是32?

Ita*_*Ale 7

CC_SHA256的参数列表是:

 extern unsigned char *CC_SHA256(const void *data, CC_LONG len, unsigned char *md);
Run Code Online (Sandbox Code Playgroud)

man页面:https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man3/CC_SHA256.3cc.html

参数说明:

  • *data是输入字符串,您想要进行哈希处理.它是C字符串类型.得到这方面的一个方法是调用"inputData.bytes",用inputData一个NSData对象.
  • len是输入字符串的长度.正如你将意识到你是否会开始使用C字符串一样,使用字符串的函数询问长度是很正常的.这是因为在C字符串中只是一个字节序列,而文本字符串通常由空字节终止,二进制字符串可以有任意长度.它也是为了安全("缓冲区溢出").
  • *md是输出.同样,它作为C字符串返回,固定长度为32字节,用于SHA256(这就是为什么你没有看到outputLength参数).
  • 输出"不相关",但可用于检查函数是否正常运行: if(CC_SHA256(...)) { all ok; }

结果字符串存储在*md,它是一个32字节长的二进制C字符串.它长32个字节,因为这是SHA256摘要的长度; 例如,MD5为16个字节,SHA1为20个字节等.这就是算法的工作原理!
输出只是一个二进制字符串.如果要将其设置为十六进制格式,则需要将其存储到NSData对象中,然后获取它的十六进制表示形式:

NSData *resultData = [NSData dataWithBytes:hashedChars length:32];
Run Code Online (Sandbox Code Playgroud)

要获得十六进制表示,请查看此SO答案:https://stackoverflow.com/a/25378464/192024