美文网首页
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哈希(散列)函数

    HASH严格来说,不算加密,但是常常和加密算法配合使用。 这里需要提两个原则:1.网络上不允许明文传递用户隐私信息...

  • 区块链技术之哈希算法

    一、哈希是什么? Hash,一般翻译为散列、音译为哈希。它是一种数学函数,又被称为散列函数。哈希算法又称为哈希函数...

  • MD5算法原理及实现

    散列函数 散列函数,也称作哈希函数,消息摘要函数,单向函数或者杂凑函数。散列函数主要用于验证数据的完整性。通过散列...

  • 单向散列函数

    单向散列函数的说明单向散列函数也称为消息摘要函数, 哈希函数 或者 杂凑函数单向散列函数输出的散列值又称为消息摘要...

  • 哈希算法

    一,概念 前面涉及到散列表,散列函数,散列算法。那么和哈希算法又是什么关系,其实散列函数对应的算法就是哈希算法。 ...

  • 密码学及iOS签名(二) —— 单向散列函数

    单向散列函数 单向散列函数,又被称为消息摘要函数(message digest function),哈希函数 输出...

  • MurmurHash一致性Hash算法(JAVA版)

    一、哈希函数 1.1 定义 散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数...

  • 漫谈散列函数

    说到散列,一般对应于散列表(哈希表)和散列函数。我们今天不谈哈希表,仅谈下散列函数。 定义 引一段百度百科关于散列...

  • 散列、对称加密和非对称加密

    一、散列(哈希) 1.简介 散列函数,又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散...

  • 哈西值

    1.什么是Hash(散列函数,哈希函数) Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的...

网友评论

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

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