23

我有一个生成字符串的 sha256 加密的函数,

这是功能:

    -(NSString*)sha256HashFor:(NSString*)input
{
    const char* str = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, strlen(str), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

现在这条线CC_SHA256(str, strlen(str), result);就是产生这个警告的原因(警告是针对 strlen(str) 变量的)。

Implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'CC_LONG' (aka 'unsigned int')

我猜我只需要将 strlen(str) 转换为 CC_Long,但我不知道该怎么做。

4

3 回答 3

56
  1. 大概这不是错误,而是警告。

  2. “我只需要将 strlen(str) 转换为 CC_Long,但我不知道该怎么做。” - 显式类型转换(类型转换):,(CC_LONG)strlen(str)但我不认为你真的需要这个。

于 2013-06-09T20:30:34.263 回答
3

此代码不会显示任何警告并且可以完美运行。

- (NSString*) sha256 {
    const char * pointer = [self UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(pointer, (CC_LONG)strlen(pointer), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}
于 2017-09-06T11:03:13.070 回答
1

从 iOS 的角度来看,CC_LONG(又名 uint32_t)和 size_t(unsigned long)大小不兼容这一事实在某些应用程序中可能是一个安全/稳定性问题,尤其是在处理可重用的库函数时。

MD5 散列是可能无限长消息的 128 位散列,因此这个警告是有充分理由的。如果截断大于 2^32 的长度,则会得到不正确的哈希值。

您的代码应该在逻辑上决定它可以支持多大的字符串。在这种使用 CC_MD5 的情况下,它必须是 2^32 字节。

MD5 输入/输出的最大长度

于 2015-09-15T16:15:30.700 回答