美文网首页
iOS开发 关于MD5加密的相关使用

iOS开发 关于MD5加密的相关使用

作者: 守候的流年 | 来源:发表于2016-12-05 22:06 被阅读113次

    MD5加密算法多用于文件的验证, 比如说登录密码的匹配就是利用MD5的加密方式,还比如说安卓手机刷ROM包, windows封装系统等为了防止他人对文件进行篡改,都有使用MD5加密对其验证.

    MD5简介


    1、简单说明:

    全称是:Message Digest Algorithm 5,译为“消息摘要算法第5版”
    效果:对输入信息生成唯一的128位散列值(32个字符)
    MD5生成的是固定的128bit,即128个0和1的二进制位,而在实际应用开发中,通常是以16进制输出的,所以正好就是32位的16进制,说白了也就是32个16进制的数字。

    2、MD5的特点:

    (1)输入两个不同的明文不会得到相同的输出值
    (2)根据输出值,不能得到原始的明文,即其过程不可逆(只能加密, 不能解密)

    3、 MD5的应用:

    由于MD5加密算法具有较好的安全性,而且免费,因此该加密算法被广泛使用
    大多数的登录功能向后台提交密码时都会使用到这种算法

    4、注意点:

    (1)一定要和后台开发人员约定好,MD5加密的位数是16位还是32位(大多数都是32位的),16位的可以通过32位的转换得到。
    (2)MD5加密区分 大小写,使用时要和后台约定好。

    5、MD5解密:

    解密网站: http://www.cmd5.com/

    MD5代码:

    自定义一个继承自NSObject的类:MD5Tool类

    MD5Tool.h

    #import <Foundation/Foundation.h>
    
    @interface MD5Tool : NSObject
    /**
     *  MD5加密, 32位 小写
     *
     *  @param str 传入要加密的字符串
     *
     *  @return 返回加密后的字符串
     */
    +(NSString *)MD5ForLower32Bate:(NSString *)str;
    
    /**
     *  MD5加密, 32位 大写
     *
     *  @param str 传入要加密的字符串
     *
     *  @return 返回加密后的字符串
     */
    +(NSString *)MD5ForUpper32Bate:(NSString *)str;
    
    /**
     *  MD5加密, 16位 小写
     *
     *  @param str 传入要加密的字符串
     *
     *  @return 返回加密后的字符串
     */
    +(NSString *)MD5ForLower16Bate:(NSString *)str;
    
    /**
     *  MD5加密, 16位 大写
     *
     *  @param str 传入要加密的字符串
     *
     *  @return 返回加密后的字符串
     */
    +(NSString *)MD5ForUpper16Bate:(NSString *)str;
    
    @end
    
    

    MD5Tool.m

    #import "MD5Tool.h"
    #import <CommonCrypto/CommonCrypto.h>
    
    @implementation MD5Tool
    
    #pragma mark - 32位 小写
    +(NSString *)MD5ForLower32Bate:(NSString *)str{
        
        //要进行UTF8的转码
        //1.首先将字符串转换成UTF-8编码, 因为MD5加密是基于C语言的,所以要先把字符串转化成C语言的字符串
        const char* input = [str UTF8String];
        
        //2.然后创建一个字符串数组,接收MD5的值
        unsigned char result[CC_MD5_DIGEST_LENGTH];
        
        //3.计算MD5的值, 这是官方封装好的加密方法:把我们输入的字符串转换成16进制的32位数,然后存储到result中
        CC_MD5(input, (CC_LONG)strlen(input), result);
        /**
         第一个参数: 要加密的字符串
         第二个参数: 获取要加密字符串的长度
         第三个参数: 接收结果的数组
         */
        
        //4.创建一个字符串保存加密结果
        NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        
        //5.从result 数组中获取加密结果并放到 saveResult -> (digest) 中
        for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
            [digest appendFormat:@"%02x", result[i]];
        }
        
        /*
         x表示十六进制,%02X  意思是不足两位将用0补齐,如果多余两位则不影响
         NSLog("%02X", 0x888);  //888
         NSLog("%02X", 0x4); //04
         */
        
        return digest;
    }
    
    #pragma mark - 32位 大写
    +(NSString *)MD5ForUpper32Bate:(NSString *)str{
        
        //要进行UTF8的转码
        const char* input = [str UTF8String];
        unsigned char result[CC_MD5_DIGEST_LENGTH];
        CC_MD5(input, (CC_LONG)strlen(input), result);
        NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
            [digest appendFormat:@"%02X", result[i]];
        }
        return digest;
    }
    
    #pragma mark - 16位 大写
    +(NSString *)MD5ForUpper16Bate:(NSString *)str{
        
        NSString *md5Str = [self MD5ForUpper32Bate:str];
        
        NSString  *string;
        for (int i=0; i<24; i++) {
            string=[md5Str substringWithRange:NSMakeRange(8, 16)];
        }
        return string;
    }
    
    #pragma mark - 16位 小写
    +(NSString *)MD5ForLower16Bate:(NSString *)str{
        
        NSString *md5Str = [self MD5ForLower32Bate:str];
        
        NSString  *string;
        for (int i=0; i<24; i++) {
            string=[md5Str substringWithRange:NSMakeRange(8, 16)];
        }
        return string;
    }
    
    @end
    

    使用:

    导入MD5Tool.h
    调用类方法:

        NSString *str1 = [MD5Tool MD5ForLower16Bate:@"MD5加密算法"];
        NSLog(@"小写16位:%@", str1);
        
        NSString *str2 = [MD5Tool MD5ForLower32Bate:@"MD5加密算法"];
        NSLog(@"小写32位:%@", str2);
        
        NSString *str3 = [MD5Tool MD5ForUpper16Bate:@"MD5加密算法"];
        NSLog(@"大写16位:%@", str3);
        
        NSString *str4 = [MD5Tool MD5ForUpper32Bate:@"MD5加密算法"];
        NSLog(@"大写32位:%@", str4);
    

    加密的结果如下

    2016-12-05 22:05:42.224 new[1258:58874] 小写16位:02dc4b81cf28f276
    2016-12-05 22:05:42.715 new[1258:58874] 小写32位:89a216fa02dc4b81cf28f276d3e8493b
    2016-12-05 22:05:43.217 new[1258:58874] 大写16位:02DC4B81CF28F276
    2016-12-05 22:05:43.754 new[1258:58874] 大写32位:89A216FA02DC4B81CF28F276D3E8493B
    
    

    相关文章

      网友评论

          本文标题:iOS开发 关于MD5加密的相关使用

          本文链接:https://www.haomeiwen.com/subject/erelmttx.html