你的位置:首页 > 操作系统

[操作系统]IOS 杂笔-9 (MD5 加密)


首先是一段对MD5的简介

*出自一位大牛之手*

Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护

 是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

 MD5算法具有以下特点:

 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

 2、容易计算:从原数据计算出MD5值很容易。

 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

 4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

 MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。

//// ViewController.m// CX-MD5加密//// Created by xubaoaichiyu on 16/3/22.// Copyright © 2016年 大xubaoaichiyu. All rights reserved.//#import "ViewController.h"#import "NSString+Hash.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  // Do any additional setup after loading the view, typically from a nib.    NSString * password = @"xubaoaichiyu";    NSLog(@"%@",password.md5String);    //md5加盐  NSString * repassword = [password stringByAppendingString:@"love"];    NSLog(@"%@",repassword.md5String);}@end

MD5 可以说是用c语言编程,但是对于喜欢面向对象的我们当然会有三方实现。通过这个三方我门可以很方便的解决繁重的c语言代码上。下面是三方的.h.m文件。

//// NSString+Hash.h//// Created by Tom Corwine on 5/30/12..//#import <Foundation/Foundation.h>@interface NSString (Hash)@property (readonly) NSString *md5String;@property (readonly) NSString *sha1String;@property (readonly) NSString *sha256String;@property (readonly) NSString *sha512String;- (NSString *)hmacSHA1StringWithKey:(NSString *)key;- (NSString *)hmacSHA256StringWithKey:(NSString *)key;- (NSString *)hmacSHA512StringWithKey:(NSString *)key;@end

//// NSString+Hash.m//// Created by Tom Corwine on 5/30/12.//#import "NSString+hash.h"#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonHMAC.h>@implementation NSString (Hash)- (NSString *)md5String{  const char *string = self.UTF8String;  int length = (int)strlen(string);  unsigned char bytes[CC_MD5_DIGEST_LENGTH];  CC_MD5(string, length, bytes);  return [self stringFromBytes:bytes length:CC_MD5_DIGEST_LENGTH];}- (NSString *)sha1String{  const char *string = self.UTF8String;  int length = (int)strlen(string);  unsigned char bytes[CC_SHA1_DIGEST_LENGTH];  CC_SHA1(string, length, bytes);  return [self stringFromBytes:bytes length:CC_SHA1_DIGEST_LENGTH];}- (NSString *)sha256String{  const char *string = self.UTF8String;  int length = (int)strlen(string);  unsigned char bytes[CC_SHA256_DIGEST_LENGTH];  CC_SHA256(string, length, bytes);  return [self stringFromBytes:bytes length:CC_SHA256_DIGEST_LENGTH];}- (NSString *)sha512String{  const char *string = self.UTF8String;  int length = (int)strlen(string);  unsigned char bytes[CC_SHA512_DIGEST_LENGTH];  CC_SHA512(string, length, bytes);  return [self stringFromBytes:bytes length:CC_SHA512_DIGEST_LENGTH];}- (NSString *)hmacSHA1StringWithKey:(NSString *)key{  NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];  NSData *messageData = [self dataUsingEncoding:NSUTF8StringEncoding];  NSMutableData *mutableData = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH];  CCHmac(kCCHmacAlgSHA1, keyData.bytes, keyData.length, messageData.bytes, messageData.length, mutableData.mutableBytes);  return [self stringFromBytes:(unsigned char *)mutableData.bytes length:mutableData.length];}- (NSString *)hmacSHA256StringWithKey:(NSString *)key{  NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];  NSData *messageData = [self dataUsingEncoding:NSUTF8StringEncoding];  NSMutableData *mutableData = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];  CCHmac(kCCHmacAlgSHA256, keyData.bytes, keyData.length, messageData.bytes, messageData.length, mutableData.mutableBytes);  return [self stringFromBytes:(unsigned char *)mutableData.bytes length:mutableData.length];}- (NSString *)hmacSHA512StringWithKey:(NSString *)key{  NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];  NSData *messageData = [self dataUsingEncoding:NSUTF8StringEncoding];  NSMutableData *mutableData = [NSMutableData dataWithLength:CC_SHA512_DIGEST_LENGTH];  CCHmac(kCCHmacAlgSHA512, keyData.bytes, keyData.length, messageData.bytes, messageData.length, mutableData.mutableBytes);  return [self stringFromBytes:(unsigned char *)mutableData.bytes length:mutableData.length];}#pragma mark - Helpers- (NSString *)stringFromBytes:(unsigned char *)bytes length:(int)length{  NSMutableString *mutableString = @"".mutableCopy;  for (int i = 0; i < length; i++)    [mutableString appendFormat:@"%02x", bytes[i]];  return [NSString stringWithString:mutableString];}@end