iOS的签名与证书机制(二):单向散列函数

完整文章列表:
iOS的签名与证书机制(一):加密解密
iOS的签名与证书机制(二):单向散列函数
iOS的签名与证书机制(三):数字签名与证书
iOS的签名与证书机制(四):iOS的签名

单向散列函数(One-way hash function),也称之为消息摘要函数(Message Digest Function),哈希函数,它可以根据消息的内容计算出一个散列值,这个散列值,我们可以看做是这个消息的数字指纹,而且不管消息的内容多少,小到几个字节,大到你珍藏多年的学习资料,都会被压缩为一段固定长度的散列值,这是一个有损压缩的过程.
之所以要学习单向散列函数,是为了下一章的数字签名打下基础;

翠花继续上图:


SHA1散列函数.png

我们来看看单向散列函数的特点:

  • 任意长度的信息,计算出固定的散列值;
  • 单向性,即不可逆性,从散列值不能计算出原有的消息,不过对于MD5以及SHA-1算法,目前证明可以被破解,这里要介绍一下王小云教授,带领中国团队破解了这两种算法;
  • 如果明文不一样,那么散列后的结果一定不一样;
  • 如果明文一样,散列后的结果一定一样;

常见的单向散列函数有以下几种:

  • MD4,MD5:Message Digest 4(5),产生的是128bit的散列值,目前已经不安全,可以被暴力破解;
    在我们的Mac终端,可以直接使用md5命令;
    在项目中我们经常使用的是对用户密码等隐私信息进行MD5加密,然后发送到服务器,下面就是我们常用的MD5加密代码
#import <CommonCrypto/CommonCrypto.h>

@implementation NSString (MD5)
#pragma mark - 32位 小写 
- (NSString *)MD5ForLower32Bate{
    //要进行UTF8的转码
    const char* input = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);
    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digest appendFormat:@"%02x", result[i]];
    } return digest; }
  • SHA-1:Secure Hash Algorithm 1,安全散列算法1,产生160bit的散列值,目前已不安全,下面我也会附上iOS项目中使用该算法加密的代码;
  • SHA-2:包括了SHA-256,SHA-384,SHA-512,对应的计算出的散列值长度为256bit,384bit,512bit;
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonHMAC.h>
@implementation NSString (Hash)
- (NSString *)sha1String
{
    const char *string = self.UTF8String;
    int length = (int)strlen(string);
    unsigned char bytes[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(string, length, bytes);
    return [self stringFromBytes:bytes length:CC_SHA1_DIGEST_LENGTH];
}

- (NSString *)sha256String
{
    const char *string = self.UTF8String;
    int length = (int)strlen(string);
    unsigned char bytes[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(string, length, bytes);
    return [self stringFromBytes:bytes length:CC_SHA256_DIGEST_LENGTH];
}

- (NSString *)sha512String
{
    const char *string = self.UTF8String;
    int length = (int)strlen(string);
    unsigned char bytes[CC_SHA512_DIGEST_LENGTH];
    CC_SHA512(string, length, bytes);
    return [self stringFromBytes:bytes length:CC_SHA512_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(unsigned char *)bytes length:(NSInteger)length
{
    NSMutableString *mutableString = @"".mutableCopy;
    for (NSInteger i = 0; i < length; i++)
        [mutableString appendFormat:@"%02x", bytes[i]];
    return [NSString stringWithString:mutableString];
}

  • SHA-3:包括了SHA3-256,SHA3-384,SHA3-512,对应的计算出的散列值长度为256bit,384bit,512bit,这也是现在全新的标准;

那么单向散列函数可以应用在哪些方面呢?

  1. 隐私信息加密传输;
    当用户在客户端填写完账号密码向服务器验证的时候,密码绝对不能明文传输,或者说我们在服务器中保存的只是用户密码的哈希值,每次用两个哈希值进行比较;


    口令加密.png
  2. 文件识别,防止数据被篡改;
    很多unix软件下载的时候,在文件的下载地址下方会有一个散列值,同时还会提供一套计算文件散列值的小工具,当你下载完毕的时候,计算出下载文件的散列值与官方的进行对比,如果一致则说明软件是安全的,没有被篡改过;
    比如这个软件:https://www.realvnc.com/en/connect/download/vnc/;
    这也正是下一章的数字签名会用到的特性;
  3. 保存文件与图片的唯一性,防止重复下载;
    很多App需要从服务器下载图片或者文件,存储在本地的时候,可以用下载地址的md5散列值来作为文件名.下载之前,可以通过下载地址的md5散列值来检查本地是否已经有了该文件,避免重复下载;

看到这里,需要小伙伴记住的是:消息摘要,作为信息的签名和指纹,可以把大量信息压缩为一个固定长度的散列值,可以验证消息是否被篡改;

在下一章的数字签名中,小伙伴就可以看到它的具体应用;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335