一、常用术语
- 密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称秘钥。
- 明文:没有进行加密,能够直接代表原文含义的信息
- 密文:经过加密处理之后,隐藏原文含义的信息
- 加密:将明文转换成密文的实施过程
- 解密:将密文转换成明文的实施过程
二、MD5
MD5:名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5算法的特点:
- 压缩性:任意长度的数据,算出的MD5值长度都是固定的128位 二进制,32位 十六进制。
- 容易计算:从原数据计算出MD5值很容易。
- 抗修改性:对源数据进行任何改动,哪怕只改一个字节,所得到的MD5值都有很大差别。
- 强抗碰撞:已知源数据及其MD5值,想找到一个具有相同MD5值的数据是非常困难的。
使用MD5加密时,首先要引入<CommonCrypto/CommonCrypto.h>头文件,在进行如下操作,例如对NSString类型进行加密
#import <CommonCrypto/CommonCrypto.h>//加密相关的头文件
//MD5对字符串进行加密 128位的二进制, 32位 十六进制
-(void)md5MethodWithSourceingString:(NSString*)sourceString{
//用的是c语言的函数进行的加密,所以我们需要将字符串转换为c语言字符串
const char* str = sourceString.UTF8String;
//声明一个c语言的字符数组用来存放加密之后的所有字符
unsigned char result[CC_MD5_DIGEST_LENGTH];
//MD5加密
//第一个参数:要加密的源字符串
//第二个参数:要加密的字符串的长度
//第三个参数:用来接收加密好的字符的容器
CC_MD5(str, (CC_LONG)strlen(str), result);
//将加密好的字符数组中的字符转为16进制的字符串以供使用
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
//将c语言字符转换为16进制的字符串
[resultStr appendFormat:@"%02x",result[i]];
}
NSLog(@"md5----%@",resultStr);
}
使用MD5对NSData类型的数据进行加密,例如加密图片
//用MD5对NSData类型进行加密
-(void)md5WithsourceData:(NSData*)sourceData{
//创建MD5变量
CC_MD5_CTX md5;
//初始化MD5变量
CC_MD5_Init(&md5);
//准备MD5加密
//第一个参数就是MD5变量取地址
//第二个参数就是要进行加密的数据 bytes是将NSData转换为c语言的二进制类型
//第三个参数就是数据长度
CC_MD5_Update(&md5, sourceData.bytes, (CC_LONG)sourceData.length);
//结束MD5加密
// 接收加密好的数据容器
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &md5);
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02X",result[i]];
}
NSLog(@"MD5png-------%@",resultStr);
}
三、SHA-1
SHA1安全散列算法(英语:Secure Hash Algorithm)是一种能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。
例如SHA-1对字符串进行加密
//SHA-1加密 160位 二进制 40位 十六进制
-(void)shaMethodWithSourceingString:(NSString*)sourceString{
//用的是c语言的函数进行的加密,所以我们需要将字符串转换为c语言字符串
const char* str = sourceString.UTF8String;
//声明一个c语言的字符数组用来存放加密之后的所有字符
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(str, (CC_LONG)strlen(str), result);
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02x",result[i]];
}
NSLog(@"sha-1-------%@",resultStr);
}
SHA-1对NSData类型的数据进行加密,这里加密图片
//用SHA-1对NSData类型进行加密
-(void)shaWithsourceData:(NSData*)sourceData{
//创建MD5变量
CC_SHA1_CTX sha;
//初始化MD5变量
CC_SHA1_Init(&sha);
//准备MD5加密
CC_SHA1_Update(&sha, sourceData.bytes, (CC_LONG)sourceData.length);
//结束MD5加密
unsigned char result[CC_SHA1_DIGEST_LENGTH];
//结束加密
CC_SHA1_Final(result, &sha);
NSMutableString* resultStr=[[NSMutableString alloc] init];
for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02X",result[i]];
}
NSLog(@"SHApng-------%@",resultStr);
}
四、钥匙串加密
钥匙串(英文:Keychain)是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中被导入,并且包括在了所有后续的Mac OS版本中,包括Mac OS X。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。KeyChain是一种对称加密
(1)首先拖入KeychainItemWrapper的.m和.h文件
(2)在工程的Build Phases设置的Compile Sources下给KeychainItemWrapper.m后面加上-fno-objc-arc,让这个非arc的类可以在arc工程下编译
(3)在Link Binary With Libraries下面加上Security.framework
接下来进行加密就可以了
//钥匙串加密
//一般用在保存我们不希望发生变化的数据,例如应用程序的UUID,在iOS7之后,我们将应用程序卸载重装,应用程序的UUID可能会发生变化,我们不希望它一直变化,就可以将UUID存储在钥匙串中
-(void)keychain{
//初始化工具类
//第一个参数:当前工具的标识符,为了取值的时候,可以根据标识符找到对应的工具
//第二个参数:一般填工程的唯一标识符,一般是用来区分是哪个工程所保存的数据
KeychainItemWrapper* key=[[KeychainItemWrapper alloc] initWithIdentifier:@"yf" accessGroup:@"com.xalo.Test-01.Senior-secret-YF"];
//存储用户名和密码
//使用和字典基本一致,但是key必须使用系统提供的,不能自己定义
[key setObject:@"用户名" forKey:(__bridge id)kSecAttrAccount];
[key setObject:@"密码" forKey:(__bridge id)kSecValueData];
//清除钥匙串中存储的数据
// [key resetKeychainItem];
NSString* userName= [key objectForKey:(__bridge id)kSecAttrAccount];
NSLog(@"%@",userName);
NSString* passWord= [key objectForKey:(__bridge id)kSecValueData];
NSLog(@"%@",passWord);
}
网友评论