首先是一段对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