APP安全机制(七)—— SHA加密

版本记录

版本号 时间
V1.0 2017.08.20

前言

在这个信息爆炸的年代,特别是一些敏感的行业,比如金融业和银行卡相关等等,这都对app的安全机制有更高的需求,很多大公司都有安全 部门,用于检测自己产品的安全性,但是及时是这样,安全问题仍然被不断曝出,接下来几篇我们主要说一下app的安全机制。感兴趣的看我上面几篇。
1. APP安全机制(一)—— 几种和安全性有关的情况
2. APP安全机制(二)—— 使用Reveal查看任意APP的UI
3. APP安全机制(三)—— Base64加密
4. APP安全机制(四)—— MD5加密
5. APP安全机制(五)—— 对称加密
6. APP安全机制(六)—— 非对称加密

SHA算法基本了解

下面我们先对SHA算法进行简单的了解,以下部分内容来自百度百科

SHA基本了解

SHA也可以称为安全哈希算法或者安全散列算法。

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

SHA是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过2^64二进制位的消息。SHA-384和SHA-512适用于长度不超过2^128二进制位的消息。

下面我们看一下SHA算法目前的家族成员。

SHA算法

散列算法

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:

  • MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法
  • SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值。

在1993年,安全散列算法(SHA)由美国国家标准和技术协会(NIST)提出,并作为联邦信息处理标准(FIPS PUB 180)公布;1995年又发布了一个修订版FIPS PUB 180-1,通常称之为SHA-1。SHA-1是基于MD4算法的,并且它的设计在很大程度上是模仿MD4的。现在已成为公认的最安全的散列算法之一,并被广泛使用。


SHA算法基本原理

下面我们就看一下SHA算法的基本原理。

SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。

该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。

通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

MAC(信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。


SHA-1与MD5的比较

因为二者均由MD4导出,都是不可逆的,SHA-1和MD5彼此很相似,都是把输入二进制串分成512位的块,把二进制串的位数存储在最后64位,二者之间填充为0,依次对每个块进行一些列高深的数学运算,最后得到一个160位的二进制串。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

  • 对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
  • 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
  • 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

SHA-1停止计划

2005年,密码学家就证明SHA-1的破解速度比预期提高了2000倍,虽然破解仍然是极其困难和昂贵的,但随着计算机变得越来越快和越来越廉价,SHA-1算法的安全性也逐年降低,已被密码学家严重质疑,希望由安全强度更高的SHA-2替代它。

微软第一个宣布了SHA-1弃用计划,对于SSL证书和代码签名证书,微软设定了不同的替换时间表。

  • 所有Windows受信任的根证书颁发机构(CA)从2016年1月1日起必须停止签发新的SHA-1签名算法SSL证书和代码签名证书;
  • 对于SSL证书,Windows将于2017年1月1日起停止支持SHA1证书。也就是说:任何在之前签发的SHA-1证书必须替换成SHA-2证书;
  • 对于代码签名证书,Windows将于2016年1月1日停止接受没有时间戳的SHA-1签名的代码和SHA-1证书。也就是说,Windows仍然接受在2016年1月1日之前使用SHA-1签名的已经加上RFC3161时间戳的代码,直到微软认为有可能出现SHA-1攻击时。

SHA加密应用领域

计算MD5或sha-1加密哈希值的文件

当您将哈希算法应用于任意数量的如一个二进制文件的数据时结果将是一个哈希或消息摘要。此哈希具有固定的大小。MD5 是创建一个 128 位的哈希值的哈希算法。sha-1 是创建一个 160 位哈希值的哈希算法。

文件校验和完整性验证程序(Microsoft File Checksum Integrity Verifier,简写为FCIV) 实用程序可以用于计算 MD5SHA-1 加密哈希值的文件。


SHA加密算法的工作过程

  • 附加添凑位

对信息附加添凑位以便使它的长度等于448(模512)。即使信息已经达到需要的长度,也总是附加添凑位。因此,添凑位的长度范围是1至512位。添凑位由单个“1”后跟必要数目的“0”组成。

  • 附加长度

将一个长64位的数据块附加到信息添凑位后,这个块被视为一个无符号的64位整数,而且包含了信息在附加添凑位之前的初始长度。

前面两步的结果是产生长度为512的整数倍的信息。用数字标记信息扩展后的512位分组序列Y0,Y1…YL-1,于是扩展后信息的总长度是LX512位。同样地,结果是16个32位字的整数倍。让M0,M1…MN-1代表结果信息字,N为16的整数倍,因此N=LX16。

  • 初始化MD缓冲区

用一个160位的缓冲区存放哈希函数的中间结果和最终结果。这个缓冲区用5个32位寄存器(A,B,C,D,E)表示。这些寄存器初始化为如下的16进制值(高8位在前):

A = 67452301
B = EFCDAB89
C = 98BADCFE
D = 10325476
E = C3D2E1FO
  • 处理512位(16字)信息分组

SHA加密算法的核心是一个由80步处理组成的模块,请注意每一层(round)的输入是当前正处理的512位分组YQ和值为ABCDE的160位缓冲区,并在每一层修改缓冲区的内容。再每一层中用到了一个辅助常数K1,K1只用到4个不同的常数值。总之,对分组YQ,SHA加密算法以YQ和摘要的中间值MDQ作为输入。MDQ放在缓冲区ABCDE中,第80步的输出与MDQ相加以产生MDQ+1。这个加法是利用模232加法,由缓冲区5个字中的每一个字单独地与MDQ中相应的字相加完成。

  • 输出

当所有的L个512位分组处理完后,从L阶段的输出是160位的信息摘要。


SHA算法代码实现

首先要注意的就是先要引入头文件。

#import <CommonCrypto/CommonDigest.h>

下面还是直接看代码。

1. JJSHAVC.m
#import "JJSHAVC.h"
#import <CommonCrypto/CommonDigest.h>

@interface JJSHAVC ()

@end

@implementation JJSHAVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //SHA1加密
    NSString *sha1Result = [self sha1EncryptWithStr:@"Celin"];
    NSLog(@"sha1Result = %@", sha1Result);
    
    //SHA224加密
    NSString *sha224Result = [self sha224EncryptWithStr:@"Celin"];
    NSLog(@"sha224Result = %@", sha224Result);
    
    //SHA256加密
    NSString *sha256Result = [self sha256EncryptWithStr:@"Celin"];
    NSLog(@"sha256Result = %@", sha256Result);
    
    //SHA384加密
    NSString *sha384Result = [self sha384EncryptWithStr:@"Celin"];
    NSLog(@"sha384Result = %@", sha384Result);
    
    //SHA512加密
    NSString *sha512Result = [self sha512EncryptWithStr:@"Celin"];
    NSLog(@"sha512Result = %@", sha512Result);
}

#pragma mark - Object Private Function

//SHA1加密

- (NSString *)sha1EncryptWithStr:(NSString *)str
{
    const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:str.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, (CC_LONG)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
}

//SHA224加密

- (NSString *)sha224EncryptWithStr:(NSString *)str
{
    const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:str.length];
    
    uint8_t digest[CC_SHA224_DIGEST_LENGTH];
    
    CC_SHA224(data.bytes, (CC_LONG)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA224_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA224_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
}

//SHA256加密

- (NSString *)sha256EncryptWithStr:(NSString *)str
{
    const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:str.length];
    
    uint8_t digest[CC_SHA256_DIGEST_LENGTH];
    
    CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
}

//SHA384加密

- (NSString *)sha384EncryptWithStr:(NSString *)str
{
    const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:str.length];
    
    uint8_t digest[CC_SHA384_DIGEST_LENGTH];
    
    CC_SHA384(data.bytes, (CC_LONG)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA384_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA384_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
}

//SHA512加密

- (NSString *)sha512EncryptWithStr:(NSString *)str
{
    const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:str.length];
    
    uint8_t digest[CC_SHA512_DIGEST_LENGTH];
    
    CC_SHA512(data.bytes, (CC_LONG)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
}

@end

下面看输出结果

2017-08-21 14:13:55.643371+0800 JJOC[10671:5089584] sha1Result = aed363e0fba9c78464db73d4194e5f20c3f15297
2017-08-21 14:13:55.643609+0800 JJOC[10671:5089584] sha224Result = 9b7b9632f22d940c9e078624d2accd8e25e485d05f2416d28f128d74
2017-08-21 14:13:55.643764+0800 JJOC[10671:5089584] sha256Result = 7cc6c461453b280c0385f184bcc4cde59da4f912fa3710b9a694426c5e0ac9d9
2017-08-21 14:13:55.643959+0800 JJOC[10671:5089584] sha384Result = bfd50fa8b70884477e09af76e032176c032b5f1265962cef65e9c7d38ab1abc2ee8e5f43f4452f465fecdf0986cfaa2f
2017-08-21 14:13:55.644370+0800 JJOC[10671:5089584] sha512Result = d6976712a0b6cc70b88324928196fa35135e911351e9c7d8deeee6ae00c59449b557d061125ef41abab72a2db38d3f9cf1b9ae852f47c8091856f254d321ca72

从上面这个输出结果,大家可以看出SHA家族不同成员算法输出位数也是不一样的。MD5输出128bit,SHA1输出160bitSHA256输出256bit,另外还有SHA244SHA512分别输出244bit512bit,其实从他们的名字上也可以看出来输出的位数。

大家可以用网上的SHA算法加密工具进行验证,我这里只验证SHA - 1的结果,下面看个图示。

SHA - 1算法结果验证

参考文章

1. SHA加密算法

后记

未完,待续~~

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

推荐阅读更多精彩内容

  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,331评论 0 6
  • 在介绍加密算法之前, 先介绍一下 base64: 0. base64 Base64要求把每三个8Bit的字节转换为...
    reboot_q阅读 12,675评论 3 8
  • 在开发应用过程中,客户端与服务端经常需要进行数据传输,涉及到重要隐私安全信息时,开发者自然会想到对其进行加密,即使...
    闲庭阅读 3,259评论 0 11
  • 版本记录 前言 在这个信息爆炸的年代,特别是一些敏感的行业,比如金融业和银行卡相关等等,这都对app的安全机制有更...
    刀客传奇阅读 3,111评论 0 11
  • 一、密码学的起源密码学的出现主要是因为战争,有了战争,就有了密码学的应用环境。在战争中,对阵双方要保护自己的通信安...
    Qi0907阅读 1,397评论 0 1