美文网首页
iOS--HASH哈希(散列)函数

iOS--HASH哈希(散列)函数

作者: OXHO | 来源:发表于2019-05-07 00:19 被阅读0次

    HASH严格来说,不算加密,但是常常和加密算法配合使用。

    这里需要提两个原则:
    1.网络上不允许明文传递用户隐私信息;
    2.本地不允许明文保存用户隐私信息;

    哈希(散列)函数

    大致分为三类:

    --MD5
    --SHA1/256/512
    --HMAC

    哈希(散列)函数特点:

    --算法公开
    --对相同数据运算,得到的结果是一样的(https://www.cmd5.com/
    的解密,其实就是穷举)
    --对不同的数据运算,如MD5得到的结果默认是128位,32个字符(16进制标示)
    --没法逆运算
    --信息摘要,信息“指纹”,是用来做数据识别的

    哈希(散列)函数用途:

    --用户密码的加密
    --搜索引擎
    --版权
    --数字签名

    用户密码的加密(重点)

    我们创建一个Category,继承自NSString,命名为Hash;
    NSString+Hash.h
    NSString+Hash.m

    --MD5

    - (NSString *)md5String {
        const char *str = self.UTF8String;
        
        //开辟一个空间buffer
        uint8_t buffer[CC_MD5_DIGEST_LENGTH];
        
        /**
         *  //最关键的函数  CC_MD5
         *  str  需要加密数据的指针
         *
         *  (CC_LONG)strlen(str) 数据所指向的长度
         *
         *  buffer 给一个空间,用于存储返回的二进制
         *
         *
         */
        CC_MD5(str, (CC_LONG)strlen(str), buffer);
        
        //MD5是128位的,转换成16进制
        return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
    }
    
        /**
         *  返回二进制 Bytes 流的字符串表示形式
         *
         *  @param bytes  二进制 Bytes 数组
         *  @param length 数组长度
         *
         *  @return 字符串表示形式
         */
    - (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];
    }
    

    用法一(不推荐,不安全,因为可以反向查询):

        //hash我们的密码
        NSString *pwd = @"123456";
        
        pwd = pwd.md5String;
        NSLog(@"pwd = %@",pwd);
    

    用法二,静态字符串加盐(不推荐,所以不列出来,因为静态字符串是固定的):

    --HMAC
    //使用一个密钥加密,并且做两次散列
    //在实际开发中,密钥来自服务器(动态的)!
    //HMAC算一种方案,不能理解成是一种算法;
    //一个账号,对应一个KEY,而且还可以更新;

    - (NSString *)hmacMD5StringWithKey:(NSString *)key {
        const char *keyData = key.UTF8String;
        const char *strData = self.UTF8String;
        uint8_t buffer[CC_MD5_DIGEST_LENGTH];
        /**
         *  //最关键的函数  CCHmac
         *  str  需要加密数据的指针
         *。kCCHmacAlgMD5 加密算法,枚举
         *  keyData key的指针
         *  strlen(keyData) key的长度
         *  buffer 给一个空间,用于存储返回的二进制
         *  strData  加密数据的指针
         *  strlen(strData) 加密数据的长度
         *  buffer 存储空间
         */
        CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
        
        return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
    }
    

    用法一:(推荐)

        NSString *pwd = @"123456";
        pwd = [pwd hmacMD5StringWithKey:@"231"];
        NSLog(@"pwd = %@",pwd);
    

    搜索引擎

    例子:我们要搜索,iOS 哈希 函数

    搜索引擎会把每个词的HASH值获取到,我们用命令行演示

    哈希值

    把三个词的哈希值,按位对应相加,这就是搜索引擎做的关键词搜索到同一篇文章。

    版权

    用过百度云的朋友都知道,自己有一些小视频,莫名其妙的被和谐,或者别人发给你的小视频,也被和谐,是人工审核的吗?上亿条数据,人工审核显然是不可能的,审核过一个视频以后,保存当前视频的哈希值,如果有其他资料和该哈希值匹配,直接和谐!

    类似的匹配操作,还用于其他云平台。“秒传”等,都是哈希值的利用。

    数字签名(重点)

    用RSA,如果利用私钥加密,叫做“签名”。
    从字面意思来讲,为什么叫签名呢?
    --老外喜欢用支票,支票上面的签名,能够证明这玩意是你的,那么数字签名顾名思义,就是用于鉴别数字信息的方法。

    核心思想:
    1.用于验证数据的完整性,可以用HASH来验证;
    2.RSA耗时,不适合加密过大的数据;
    3.需要特别隐私的数据,在优先保证安全的同时,再去提高效率;利用时间换取空间;

    例子:客户端将一笔支付信息,发送给服务器,客户端的操作如下:
    1.将支付信息封装;
    2.将封装好的数据HASH一次;
    3.将HASH值,RSA加密;
    4.将封装好的信息和RSA加密后的信息,同时发送给服务器;
    这样,能很大概率,避免中间人串改;保护了数据的有效性;
    我们将,23步骤组合一起,RSA加密后的信息,就叫做数字签名。

    相关文章

      网友评论

          本文标题:iOS--HASH哈希(散列)函数

          本文链接:https://www.haomeiwen.com/subject/rnvqoqtx.html