MD5加密
简介
MD5是利用哈希算法来加密的。哈希算法是一种摘要算法,从严格意义上来讲它不属于加密算法(因为它没有解密的过程),MD5有以下两个最主要的特性。
- 加密的不可逆性,只能够加密,不能够解密。
- 任意长度的明文经过加密后长度都是固定的,长度为16进制32位。
它还有以下几种特点
- 容易计算:根据原数据计算出MD5很容易
- 抗修改性:MD5对原数据十分的敏感,哪怕只修改了一个字节,得到的MD5的值与之前的MD5数值都有很大的差别。
- 防伪性能高:已知原数据和它的MD5值,想要找到相同MD5值得数据是非常困难的,可以说几乎是不可能的。
示例代码
MySecurities.h 文件
#import <Foundation/Foundation.h>
@interface MySecurities : NSObject
+(NSString *)md5String:(NSString *)sourceString;//md5字符串加密
+(NSString *)md5Data:(NSData *)sourceData;//md5data加密
@end
MySecurities.m 文件
引入<CommonCrypto/CommonCrypto.h>这个头文件
@implementation MySecurities
+(NSString *)md5String:(NSString *)sourceString{
if(!sourceString){
return nil;//判断sourceString如果为空则直接返回nil。
}
//MD5加密都是通过C级别的函数来计算,所以需要将加密的字符串转换为C语言的字符串
const char *cString = sourceString.UTF8String;
//创建一个C语言的字符数组,用来接收加密结束之后的字符
unsigned char result[CC_MD5_DIGEST_LENGTH];
//MD5计算(也就是加密)
//第一个参数:需要加密的字符串
//第二个参数:需要加密的字符串的长度
//第三个参数:加密完成之后的字符串存储的地方
CC_MD5(cString, (CC_LONG)strlen(cString), result);
//将加密完成的字符拼接起来使用(16进制的)。
//声明一个可变字符串类型,用来拼接转换好的字符
NSMutableString *resultString = [[NSMutableString alloc]init];
//遍历所有的result数组,取出所有的字符来拼接
for (int i = 0;i < CC_MD5_DIGEST_LENGTH; i++) {
[resultString appendFormat:@"%02x",result[i]];
//%02x:x 表示以十六进制形式输出,02 表示不足两位,前面补0输出;超出两位,不影响。当x小写的时候,返回的密文中的字母就是小写的,当X大写的时候返回的密文中的字母是大写的。
}
//打印最终需要的字符
NSLog(@"resultString === %@",resultString);
return resultString;
}
+(NSString *)md5Data:(NSData *)sourceData{
if (!sourceData) {
return nil;//判断sourceString如果为空则直接返回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);
//将result中的字符拼接为OC语言中的字符串,以便我们使用。
NSMutableString *resultString = [NSMutableString string];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[resultString appendFormat:@"%02X",result[i]];
}
NSLog(@"resultString=========%@",resultString);
return resultString;
}
@end
base64加密
示例代码
#import <Foundation/Foundation.h>
@interface NSData (Base64)
+ (NSData *)dataWithBase64EncodedString:(NSString *)string;
- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth;
- (NSString *)base64EncodedString;
@end
@interface NSString (Base64)
+ (NSString *)stringWithBase64EncodedString:(NSString *)string;
- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth;
- (NSString *)base64EncodedString;
- (NSString *)base64DecodedString;
- (NSData *)base64DecodedData;
@end
#import "Base64.h"
#pragma GCC diagnostic ignored "-Wselector"
#import <Availability.h>
#if !__has_feature(objc_arc)
#error This library requires automatic reference counting
#endif
@implementation NSData (Base64)
+ (NSData *)dataWithBase64EncodedString:(NSString *)string
{
if (![string length]) return nil;
NSData *decoded = nil;
#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
if (![NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)])
{
decoded = [[self alloc] initWithBase64Encoding:[string stringByReplacingOccurrencesOfString:@"[^A-Za-z0-9+/=]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])]];
}
else
#endif
{
decoded = [[self alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
}
return [decoded length]? decoded: nil;
}
- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth
{
if (![self length]) return nil;
NSString *encoded = nil;
#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_9 || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0
if (![NSData instancesRespondToSelector:@selector(base64EncodedStringWithOptions:)])
{
encoded = [self base64Encoding];
}
else
#endif
{
switch (wrapWidth)
{
case 64:
{
return [self base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
case 76:
{
return [self base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
}
default:
{
encoded = [self base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)0];
}
}
}
if (!wrapWidth || wrapWidth >= [encoded length])
{
return encoded;
}
wrapWidth = (wrapWidth / 4) * 4;
NSMutableString *result = [NSMutableString string];
for (NSUInteger i = 0; i < [encoded length]; i+= wrapWidth)
{
if (i + wrapWidth >= [encoded length])
{
[result appendString:[encoded substringFromIndex:i]];
break;
}
[result appendString:[encoded substringWithRange:NSMakeRange(i, wrapWidth)]];
[result appendString:@"\r\n"];
}
return result;
}
- (NSString *)base64EncodedString
{
return [self base64EncodedStringWithWrapWidth:0];
}
@end
@implementation NSString (Base64)
+ (NSString *)stringWithBase64EncodedString:(NSString *)string
{
NSData *data = [NSData dataWithBase64EncodedString:string];
if (data)
{
return [[self alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
return nil;
}
- (NSString *)base64EncodedStringWithWrapWidth:(NSUInteger)wrapWidth
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
return [data base64EncodedStringWithWrapWidth:wrapWidth];
}
- (NSString *)base64EncodedString
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
return [data base64EncodedString];
}
- (NSString *)base64DecodedString
{
return [NSString stringWithBase64EncodedString:self];
}
- (NSData *)base64DecodedData
{
return [NSData dataWithBase64EncodedString:self];
}
@end