zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    C++中的ravalue学习笔记
    C++中的抽象类
    C++中的显式类型转换
    C++中的继承和多继承
    C++中的多态
    Yocto学习笔记
    HIDL学习笔记
    hadoop2.5搭建过程
    《Redis设计与实现》学习笔记
    40 数组中只出现一次的数字
  • 原文地址:https://www.cnblogs.com/xubaoaichiyu/p/5308152.html
Copyright © 2011-2022 走看看