欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS散列(HASH)算法

程序员文章站 2024-03-22 10:07:10
...

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

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 <CommonCrypto/CommonCrypto.h>
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<CUnsignedChar>.allocate(capacity: digestLen)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%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散列计算等!

封装代码已收藏