iOS散列(HASH)算法

总结一篇常用的加密算法文章。

1、常用加密算法

1.1 哈希(散列)函数

- MD5
- SHA1
- SHA256/512

特点

- 算法公开的
- 对相同的数据加密,得到的结果是一样的
- 对不同的数据进行加密,得到的结果都是定长
    MD5:     散列字符串32个字符
    SHA1:     散列字符串40个字符
    SHA256: 散列字符串64个字符
    SHA512: 散列字符串128个字符
- 不能反算的

1.2 对称加密算法

- DES(数据加密标准)
- 3DES
- AES(高级密码标准,美国国家安全局使用的,iOS系统使用的加密方式(钥匙串))

1.3 非对称加密算法

- RSA

1.4 ECB&CBC

  • ECB 电子代码本(Electronic Codebook Book (ECB))

    就是将一个数据拆分为多块,然后独立加密。

  • 密码分组链接模式(Cipher Block Chaining (CBC))

    先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥和向量进行加密。该方法能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏!

2、MD5

2.1 用途

  • 密码加密
    用户登录时密码验证。两条原则:
    1.在网络上不允许传输用户的明文隐私数据
    2.在本地不允许保存用户的明文隐私数据
  • 信息摘要,信息”指纹”,是用来做数据识别的(文件防篡改)
  • 搜索,关键字识别
  • 版权标注

2.2 终端查看MD5值

  • 字符串MD5值
echo -n  加密字符串  | openssl md5
或
md5 -s 加密字符串

必须要有-n参数, -n就表示不输入回车符,这样才能得到正确的结果

  • 文件MD5值
md5 file.dat(文件路径)

2.3 MD5散列计算代码

iOS使用系统MD5提供的方法前需要导入头文件#import
OC代码:

#pragma mark - 散列函数
- (NSString *)md5String {
    const char *str = self.UTF8String;
    uint8_t buffer[CC_MD5_DIGEST_LENGTH];
    CC_MD5(str, (CC_LONG)strlen(str), buffer);
    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
    NSMutableString *strM = [NSMutableString string];
    for (int i = 0; i < length; i++) {
        [strM appendFormat:@"%02x", bytes[i]];
    }
    return [strM copy];
}

Swift代码:

extension String {
    /// MD5加密
    func getMd5() -> String {
        let str = self.cString(using: String.Encoding.utf8)
        let strLen = CUnsignedInt(self.lengthOfBytes(using: String.Encoding.utf8))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer.allocate(capacity: digestLen)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        for i in 0.."%02x", result[i])
        }
        result.deallocate(capacity: digestLen)
        return String(hash)
    }
    /// MD5加密
    var md5: String! {
        return self.getMd5()
    }
}

3、SHA1 / SHA256 / SHA512

3.1 终端查看SHA函数散列值

  • 字符串HSA1值
echo -n "string" | openssl sha -sha1
或
echo -n "string" | openssl sha -sha256
或
echo -n "string" | openssl sha -sha512
  • 文件SHA1值
openssl sha -sha1 file.dat(文件路径)
或
openssl sha -sha256 file.dat
或
openssl sha -sha512 file.dat

3.2 SHA函数散列计算代码

SHA1散列代码,OC:

- (NSString *)sha1String {
    const char *str = self.UTF8String;
    // 修改参数,变换散列计算SHA1、SHA256、SHA512
    // uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
    // CC_SHA256(str, (CC_LONG)strlen(str), buffer);
    uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(str, (CC_LONG)strlen(str), buffer);
    return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
    NSMutableString *strM = [NSMutableString string];
    for (int i = 0; i < length; i++) {
        [strM appendFormat:@"%02x", bytes[i]];
    }
    return [strM copy];
}

4、散列函数总结

散列函数计算,除了以上列出的计算方法和代码外,也可以对文件进行散列计算,生成数据指纹。或者对于保密要求较高的情况,进行加盐处理,HMAC散列计算等!

封装代码已收藏

你可能感兴趣的:(iOS)