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?
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