前言
在网络发展日渐迅猛的今天,数据安全也越来越重要。在开发应用中,我们会要求开发者不允许明文传输用户的隐私数据,同时也不允许明文保存用户的隐私数据;这就需要我们去对敏感的数据进行加密处理,信息加密技术显得尤为重要。
常见加密算法:
- 哈希加密算法:MD5 , SHA1,HMAC。
- 对称加密算法:DES , AES 。
- 非对称加密算法: RSA。
在探究算法原理之前,先来研究一下Base64编码。很多人认为Base64是一种加密方式,在普通加密应用过程中可以看到Base64的影子。严格来说base64不能算是一种加密,只能说是编码转换。我们知道在计算机中任何数据都是按ASSII码存储的,而ASSII码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
Base64编码的原理是对于非二进制数据先转换为二进制,然后每6位一计算得到十进制值,根据得到的值在ASCII中找到对应的字符,最后得到一个编码后的文本字符串。编码后数据长度会变大。

Base64编码是每3个原始字符编码成4个字符,如果原始字符串长度不能被3整除,就使用0值来补充原始字符串。例如:Hello!! Base64编码的结果SGVsbG8hIQAA 。最后2个零值只是为了Base64编码而补充的,在原始字符中并没有对应的字符,那么Base64编码结果中的最后两个字符 AA 实际不带有效信息,所以需要特殊处理,以免解码错误。在Base64编码通常用 = 字符来替换最后的 A,因为 = 字符并不在Base64编码索引表中,其意义在于结束符号,在Base64解码时遇到 = 时即可知道一个Base64编码字符串结束。
言归正传,让我一起来开启哈希加密算法之旅吧!
MD5是我们最常用的哈希加密算法之一,MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
- MD5加密不可逆。
- 任意长度的明文经过加密后长度都是固定的,长度为16进制32位。
MD5还广泛用于加密技术上,用户的密码是以MD5值的方式保存的,用户Login的时候,先把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并"不知道"用户的密码是什么。MD5加密大体都应用在:验证数据或文件一致性、数字签名、安全访问认证等等。
相对来说单纯MD5加密还是很容易破解的。MD5解密网站
目前MD5的破解主要是依靠大型字典的方法,将常用密码进行MD5后建立数据库进行存储,使用MD5d后的数据做为key,根据key值来匹配进行破解。
使用MD5算法
在我们正式使用MD5之前我们还需要做一些准备工作,首先我们需要引入<CommonCrypto/CommonCrypto.h>这个头文件。下面代码是我对NSString和NSData进行加密的封装,方便以后调用。
#import <Foundation/Foundation.h>
@interface FLTMD5 : NSObject
//MD5字符串加密
+(NSString *)md5HexDigest:(NSString *)input;
//MD5data加密
+(NSString *)md5Data:(NSData *)sourceData;
@end
#import "FLTMD5.h"
//需要加入依赖库 libSystem.tdb
#import <CommonCrypto/CommonDigest.h>
@implementation FLTMD5
+(NSString *)md5HexDigest:(NSString *)input{
if (!input) {
return nil; //加密字符串为空直接返回nil。
}
//MD5加密是通过C语言实现的,需要将字符串转换为C语言的字符串
const char* str = [input UTF8String];
//创建一个C语言数组用于接受加密后的数据,CC_MD5_DIGEST_LENGTH是16个字节长度,也就是128位
unsigned char result[CC_MD5_DIGEST_LENGTH];
//MD5加密C语言方法
//参数一:需要加密的C语言字符串
//参数二:要加密的C语言字符串的长度
//参数a三:加密后的数据
CC_MD5(str, strlen(str), result);
//申明一个可变的字符串数组
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH];
//遍历所有的result数组,取出所有的字符来拼接,是以十六进制形式输出的
for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
[ret appendFormat:@"%02X",result[I]];
}
return ret;
}
+ (NSString *)md5Data:(NSData *)sourceData {
if (!sourceData) {
return nil;//判断sourceData如果为空则直接返回nil。
}
//需要MD5变量并且初始化
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
//开始加密(第一个参数:md5变量指针指向计算好数据的内存空间,第二个参数:需要计算的源数据,第三个参数:源数据的长度)
CC_MD5_Update(&md5, sourceData.bytes, (CC_LONG)sourceData.length);
//声明一个无符号的字符数组,用来盛放转换好的数据
unsigned char result[CC_MD5_DIGEST_LENGTH];
//将数据放入result数组
CC_MD5_Final(result, &md5);
NSMutableString *resultString = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultString appendFormat:@"%02X",result[I]];
}
return resultString;
}
@end
SHA1也是安全散列算法之一,将任意长度的二进制值映射为较短的固定长度的二进制值。
SHA-1:1995年发布,SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。但SHA-1的安全性在2000年以后已经不被大多数的加密场景所接受。
2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1。
SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。
虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;
//SHA字符串加密
+(NSString *)shaString:(NSString *)input;
//SHAdata加密
+(NSString *)shaData:(NSData *)sourceData;
+(NSString *)shaString:(NSString *)input {
const char *str =input.UTF8String;
unsigned char buffer[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(str, (CC_LONG)strlen(str), buffer);
NSMutableString *strM = [NSMutableString string];
for (int i =0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[strM appendFormat:@"%02x", buffer[i]];
}
return strM;
}
+(NSString *)shaData:(NSData *)sourceData {
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(sourceData.bytes, (CC_LONG)sourceData.length, result);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", result[I]];
}
return hash;
}
SHA512,SHA256等加密算法和上面方法相识,只是返回加密长度不同,提高了加密数据的安全性。
HMAC(消息认证机制)加密算法,前端和后台有一个共享密钥,在发送消息的前,使用密钥对消息进行加密得到MAC值(消息认证码),然后将消息和MAC值一起传给后台,后台拿到消息后用密钥进行加密和接收到消息认证码进行比较。

HMAC可以有效地防止数据在传输过程中被截获和篡改,维护了数据的完整性、可靠性和安全性. HMAC加密算法是一种基于密钥的报文完整性的验证方法,其安全性是建立在Hash加密算法基础上的。
+(NSString *)hmacMD5String:(NSString *)inpit withKey:(NSString *)key{
const char *keyData = key.UTF8String;
const char *strData = inpit.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
//@constant kCCHmacAlgSHA1 HMAC with SHA1 digest
//@constant kCCHmacAlgMD5 HMAC with MD5 digest
//@constant kCCHmacAlgSHA256 HMAC with SHA256 digest
//@constant kCCHmacAlgSHA384 HMAC with SHA384 digest
//@constant kCCHmacAlgSHA512 HMAC with SHA512 digest
//@constant kCCHmacAlgSHA224 HMAC with SHA224 digest
CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < buffer; i++) {
[strM appendFormat:@"%02x", buffer[i]];
}
return strM;
}
网友评论