对于一个新项目,我需要使用SHA256散列NSString。 我使用了以下代码:
unsigned char hashedChars[32];
NSString *inputString;
inputString = [NSString stringWithFormat:@"hello"];
NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA256(inputData.bytes, inputData.length, hashedChars);
我在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
2.最后哈希必须是十六进制字符串,但CC_SHA256输出的类型是什么(UTF-8 ??)?
3.CC_SHA256的第一个参数为什么我必须在末尾放置字节并且“inputData”足够了?
4.需要字符串的长度(第二个参数)?
5.最后一个参数对我没有任何意义,有人可以解释一下,为什么hashedChars必须是32?
答案 0 :(得分:7)
CC_SHA256的参数列表是:
extern unsigned char *CC_SHA256(const void *data, CC_LONG len, unsigned char *md);
参数说明:
*data
是输入字符串,您想要进行哈希处理。它是C字符串类型。获得此功能的方法是使用inputData
NSData
对象调用" inputData.bytes'。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];
要获得十六进制表示,请查看此SO答案:https://stackoverflow.com/a/25378464/192024
答案 1 :(得分:3)
如果有人试图为Android找到类似的功能,则下面的代码段会生成与CC_SHA256
相同的输出
public static String calculateSH256(String secret){
final MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-256");
byte[] bytes = secret.getBytes("UTF-8");
digest.update(bytes, 0, bytes.length);
String sig = bytesToHex(digest.digest());
return sig;
}
catch (NoSuchAlgorithmException | UnsupportedEncodingException e){
throw new RuntimeException("Cannot calculate signature");
}
}
final protected static char[] hexArray = "0123456789abcdef".toCharArray();
private static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}