'CC_MD5' is deprecated: first deprecated in iOS 13.0 - This function is cryptogr

361 阅读2分钟

CC_MD5 is deprecated: first deprecated in iOS 13.0 - This function is cryptographically broken and should not be used in security contexts. Clients should migrate to SHA256 (or stronger). 表示 CC_MD5 函数已经被弃用,并且不建议在安全上下文中使用。

解释

  1. CC_MD5 函数

    • CC_MD5 是 Apple 提供的一个用于计算 MD5 哈希值的函数。
    • MD5 是一种广泛使用的哈希函数,但它已经被证明在安全方面存在严重缺陷,容易受到碰撞攻击。
  2. 弃用

    • CC_MD5 函数在 iOS 13.0 中被标记为弃用(deprecated)。
    • 这意味着 Apple 不再推荐使用这个函数,并且在未来版本的操作系统中可能会完全移除它。
  3. 安全问题

    • MD5 哈希算法已经被证明是不安全的,容易受到各种攻击,如碰撞攻击。这意味着两个不同的输入可以产生相同的哈希值,这在安全上下文中是不可接受的。
  4. 替代方案

    • Apple 建议使用更安全的哈希算法,如 SHA-256 或更强的算法。
    • SHA-256 是一种更安全的哈希算法,目前没有已知的有效攻击方法。

解决方法

  1. 迁移到 SHA-256
    • 你可以使用 CommonCrypto 库中的 CC_SHA256 函数来替换 CC_MD5

示例代码

假设你原来使用 CC_MD5 来计算一个字符串的哈希值,现在可以改为使用 CC_SHA256

原来的代码(使用 CC_MD5):
#import <CommonCrypto/CommonDigest.h>

NSString *md5Hash(NSString *input) {
    NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char digest[CC_MD5_DIGEST_LENGTH];
    CC_MD5(data.bytes, data.length, digest);
    
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x", digest[i]];
    }
    
    return output;
}
修改后的代码(使用 CC_SHA256):
#import <CommonCrypto/CommonDigest.h>

NSString *sha256Hash(NSString *input) {
    NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char digest[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(data.bytes, data.length, digest);
    
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
    for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
        [output appendFormat:@"%02x", digest[i]];
    }
    
    return output;
}

总结

  • MD5 已经不安全:MD5 哈希算法存在严重的安全问题,不建议在安全上下文中使用。
  • Apple 的建议:Apple 建议迁移到更安全的哈希算法,如 SHA-256。
  • 代码修改:你可以使用 CommonCrypto 库中的 CC_SHA256 函数来替换 CC_MD5,以提高代码的安全性。