加密
2016-05-05 本文已影响77人
箫声_筱昇
数据安全
- 在互联网发展趋势迅猛的今天,数据安全的重要性日趋凸显.页成为我们必须了解的互联网知识.是一种主动的包含措施,数据本事有对称算法与公开密钥密码体系两种(非对称算法),都包含了数据的加密和解密的过程.
密钥
密钥是一种参数,它是在明文转换为密文或将密文转成为明文的算法中输入的参数.密钥分为对称密钥和非对称密钥(也可以根据用途来分为加密密钥和解密密钥)
明文与密文
没有进行加密,能够直接代表原文含义的信息
经过加密处理之后,隐藏原文含义的信息
MD5加密
-
压缩性;具有较好的压缩性,可以压缩任意长度的数据.算出的 MD5值长度都是固定的(16进制,32位);
-
容易计算;从源数据计算出 MD5值很容易
-
抗修改性;对源数据进行任何修改,哪怕是只修改1个字节.所得到的 MD5值都有很大的区别;
-
强抗碰撞;已知源数据和其 MD5值,想找到一个具有相同的 MD5值得数据(即为造数据)是非常困难的.
-
导入<CommonCrypto/CommonCrypto.h>
#import "RootViewController.h"
#import <CommonCrypto/CommonCrypto.h>
#import "MySecurity.h"
- (void)viewDidLoad {
[super viewDidLoad];
//MD5:1加密不可逆;2是将任意长度的数据,算出的 MD5值长度都是固定的.
//使用场景:一般用在用户名登录注册的时候. 在参数低下的签名. sign.
//更安全:1,加盐加密.2,先加密,在打乱顺序.
//将图片转化为 NSData 类型
NSData *Data = UIImageJPEGRepresentation([UIImage imageNamed:@"6.jpg"], 1.0);
NSString *str = [MySecurity base64EncoderWithData:Data];
NSLog(@"%@",str);
NSData *data = [MySecurity base64DecoderWithString:str];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
imageView.image = [UIImage imageWithData:data];
[self.view addSubview:imageView];
//base64加密.例如网易新闻.
//是可逆的.
}
#pragma mark-----加密
- (void)MD5String:(NSString *)sourceString{
const char *cstr = sourceString.UTF8String;//由于 md5加密都是通过 c级别的函数来计算.所以需要将加密的字符串转换类型为 c 语言字符串
//创建一个 C 语言的字符数组.用来接收加密结束之后的字符
unsigned char result[CC_MD5_DIGEST_LENGTH];
//MD5计算(加密);
//第一个参数:需要加密的字符串
//第二个参数:需要加密的字符串的长度
//第三个参数:加密完成之后的字符串存储的地方/
CC_MD5(cstr, (CC_LONG)strlen(cstr), result);
//将加密完成的字符拼接起来使用(16进制的).
//声明一个可变类型.用来拼接转换好的字符
NSMutableString *resultStr = [[NSMutableString alloc] init];
//遍历数组.取出所有的字符来拼接.
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02x", result[i]];//02x 16进制.位置不够的时候.用0来补齐.
}
//打印最终需要的字符.
NSLog(@"resultStr====%@",resultStr);
}
#pragma mark-----MD5对 data 类型数据加密
- (void)MD5Data:(NSData *)sourceData{
//需要 MD5变量,并且进行初始化
CC_MD5_CTX MD5;
CC_MD5_Init(&MD5);//初始化地址
//开始MD5加密
//第一个参数:对 MD5变量取地址(要为该变量指向的内存空间存储计算好的数据)
//第二个参数:需要计算的源数据
//第三个参数:源数据的长度.
CC_MD5_Update(&MD5, sourceData.bytes, (CC_LONG)sourceData.length);
//声明一个无符号的字符数组.用来存放转换好的数据
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &MD5);//将数据放入result数组
//拼接:将 result 中的字符拼接为 OC 语言中的字符串,以便我们使用
NSMutableString *resultStr = [[NSMutableString alloc] init];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02X",result[i]];
}
NSLog(@"%@",resultStr);
}
#import <Foundation/Foundation.h>
@interface MySecurity : NSObject
+ (NSString *)MD5String:(NSString *)sourceString;//对 NSString类型进行 MD5加密
+ (NSString *)MD5Data:(NSData *)sourceData;//对 NSData 类型进行 MD5加密
+ (NSString *)base64EncoderWithData:(NSData *)sourceData;//base64加密
+ (id)base64DecoderWithString:(NSString *)sourceString;//base解密
@end
#import "MySecurity.h"
#import <CommonCrypto/CommonCrypto.h>
@implementation MySecurity
#pragma mark-----加密
+ (NSString *)MD5String:(NSString *)sourceString{
const char *cstr = sourceString.UTF8String;//由于 md5加密都是通过 c级别的函数来计算.所以需要将加密的字符串转换类型为 c 语言字符串
//创建一个 C 语言的字符数组.用来接收加密结束之后的字符
unsigned char result[CC_MD5_DIGEST_LENGTH];
//MD5计算(加密);
//第一个参数:需要加密的字符串
//第二个参数:需要加密的字符串的长度
//第三个参数:加密完成之后的字符串存储的地方/
CC_MD5(cstr, (CC_LONG)strlen(cstr), result);
//将加密完成的字符拼接起来使用(16进制的).
//声明一个可变类型.用来拼接转换好的字符
NSMutableString *resultStr = [[NSMutableString alloc] init];
//遍历数组.取出所有的字符来拼接.
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02x", result[i]];//02x 16进制.位置不够的时候.用0来补齐.
}
//打印最终需要的字符.
NSLog(@"resultStr====%@",resultStr);
return resultStr;
}
#pragma mark-----MD5对 data 类型数据加密
+ (NSString *)MD5Data:(NSData *)sourceData{
//需要 MD5变量,并且进行初始化
CC_MD5_CTX MD5;
CC_MD5_Init(&MD5);//初始化地址
//开始MD5加密
//第一个参数:对 MD5变量取地址(要为该变量指向的内存空间存储计算好的数据)
//第二个参数:需要计算的源数据
//第三个参数:源数据的长度.
CC_MD5_Update(&MD5, sourceData.bytes, (CC_LONG)sourceData.length);
//声明一个无符号的字符数组.用来存放转换好的数据
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5_Final(result, &MD5);//将数据放入result数组
//拼接:将 result 中的字符拼接为 OC 语言中的字符串,以便我们使用
NSMutableString *resultStr = [[NSMutableString alloc] init];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultStr appendFormat:@"%02X",result[i]];
}
NSLog(@"%@",resultStr);
return resultStr;
}
#pragma mark-----base64加密
+ (NSString *)base64EncoderWithData:(NSData *)sourceData{
NSString *resultStr = [sourceData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];//返回值为 string 类型;
// [sourceData base64EncodedDataWithOptions:<#(NSDataBase64EncodingOptions)#>];//返回值为 NSData 类型.
if (!sourceData) {//如果加密的数据为 nil.不进行加密.直接返回/
return nil;
}
return resultStr;
}
#pragma mark-----base64解密
+ (id)base64DecoderWithString:(NSString *)sourceString{
if (!sourceString) {
return nil;
}
//解密
NSData *resultData = [[NSData alloc] initWithBase64EncodedString:sourceString options:NSDataBase64DecodingIgnoreUnknownCharacters];
return resultData;
}
@end