您的位置:首页 > 理论基础 > 计算机网络

iOS网络解析中的md5加密+时间戳

2016-03-09 18:27 1111 查看
由于最近的项目的安全问题,准备对进行网络解析和上传的接口网址进行加密,所以我就写了一个类来对网络参数进行md5加密。

但是啥是md5加密啊??,md5加密分为16位和32位,有什么区别呢??

md5-Message-Digest Algorithm 5(信息-摘要算法5),主要的目的是用于网络上信息传输的安全,主要有以下几个特点:

*同样的数据加密结果是一样。

*不可逆的.(不能逆向解密)。

*可用于文件校验/指纹识别。

具体的算法我没有研究过,所以我不知道md5的16位与32位的具体区别,只是知道位数不同,如果哪位大神知道可以教教我哈?谢谢了。

好了,我知道的就是这些了,然后看代码吧!!,我把其封装成一个类-MD5Encryption。

MD5Encryption.h文件

#import <Foundation/Foundation.h>
@interface MD5Encryption : NSObject

+ (NSString *)MD5EncryptionWithParameters:(NSDictionary *)parameters URLString:(NSString *)URLString;

// 参数说明:parameters:参数字典 URLString:接口的基地址

@end


MD5Encryption.m文件

#import "MD5Encryption.h"

// 导入md5加密所用的类
#import <CommonCrypto/CommonDigest.h>

@implementation MD5Encryption

- (instancetype)init
{
self = [super init];
if (self) {
}
return self;
}

+ (NSString *)MD5EncryptionWithParameters:(NSDictionary *)parameters URLString:(NSString *)URLString
{
MD5Encryption *encryption = [[MD5Encryption alloc] init];

// 将需要签名的参数进行拼接

// "huodongdawang_start_at_2015"作为一个约定的字符串。
NSString *appendString = [NSString stringWithFormat:@"%@%@", astring, @"huodongdawang_start_at_2015"];
NSMutableString *md5String = [NSMutableString string];
const char *orignal_str = [appendString UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(orignal_str, strlen(orignal_str), result);

for (int i = 0; i < 16; i++) {
// 这里需要注意因为md5的到的可以是大写字母和小写字母,X:获得是大写的,x:获得的是小写的
[md5String appendFormat:@"%02x", result[i]];

}
NSString *returnString = [NSString stringWithFormat:@"%@&sign=%@", astring, md5String];

return returnString;
}
// 对参数字典进行拼接处理
- (NSString *)appendStringWithDictionary:(NSDictionary *)dictionary URLString:(NSString *)URLString
{
NSString *par = [NSString string];

NSMutableArray *array = [dictionary allKeys].mutableCopy;

// 加这个参数是为了干扰固定的md5标签,因为只要是相同的内容经过md5加密得到的是相同的,所以获取当前的时间戳作为公共参数,(这个根据后台的需要而定)
[array addObject:@"timestamp"];

// 按字母顺序进行排序,保证前台与后台的md5加密结果一致
NSArray *arrOfappend = [array sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

if (arrOfappend.count > 0) {
for (NSString *key in arrOfappend) {
if (![key isEqualToString:@"timestamp"]) {
if ([par length] == 0) {
par = [NSString stringWithFormat:@"?%@=%@", key, [dictionary objectForKey:key]];
}else{
par = [NSString stringWithFormat:@"%@&%@=%@", par, key, [dictionary objectForKey:key]];
}
}
else {
// 获得时间戳
NSString *timeSp = [self dateWithNowSp];
if ([par length] == 0) {
par = [NSString stringWithFormat:@"?%@=%@", key, timeSp];
}else{
par = [NSString stringWithFormat:@"%@&%@=%@", par, key, timeSp];
}
}

}
}

// 拼接得最后的网址字符串
NSString *urlStr =[NSString stringWithFormat:@"%@%@", URLString, par];
return urlStr;
}

// 将当前时间转化为时间戳的形式
- (NSString *)dateWithNowSp
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];
[formatter setTimeZone:timeZone];
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
return timeSp;
}
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: