有关CC_SHA256 objective-c的一些信息

时间:2014-07-30 18:15:22

标签: 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);

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

2 个答案:

答案 0 :(得分:7)

CC_SHA256的参数列表是:

 extern unsigned char *CC_SHA256(const void *data, CC_LONG len, unsigned char *md);

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

参数说明:

  • *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);
    }