关于MD5记录

作者: edison0428 | 来源:发表于2017-04-11 16:05 被阅读4次

    项目中有用到md5加密,其实也是在从后台那数据的时候,加一个时间戳的参数

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

    MD5特点:
    1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
    2、容易计算:从原数据计算出MD5值很容易。
    3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
    4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

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

    事先介绍一个概念,因为下边有用到👇
    加盐:所谓加盐, 就是在原本需要加密的信息基础上,糅入其它内容salt。

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

    直接上代码,方便以后参考
    写一个NSString+MD5的分类
    .h文件

    /@interface NSString (MD5)
    
    #pragma mark - 加密的位数为32位
    /** 直接加密 */
    - (NSString *)MD5_32BIT;
    /** 加盐 */
    - (NSString *)MD5_saltStr:(NSString *)saltStr;
    /** 多次加密 */
    - (NSString *)MD5_againStr:(NSString *)againStr;
    /** 乱序加密 */
    - (NSString *)MD5_Chaos:(NSString *)chaosStr;
    
    #pragma mark - 加密的位数为16位
    
    /** 直接加密 */
    - (NSString *)MD5_16BIT;
    
    
    @end
    

    .m文件

    //
    //  NSString+MD5.m
    //  MD5加密
    //
    //  Created by Edison.3 on 17/4/11.
    //  Copyright © 2017年 Edison.3. All rights reserved.
    //
    
    #import "NSString+MD5.h"
    #import <CommonCrypto/CommonDigest.h>
    
    #define salt @"addStringYouWant"
    
    @implementation NSString (MD5)
    
    #pragma mar- 32位
    // 直接加密
    - (NSString *)MD5_32BIT {
        
        const char *cStr = [self UTF8String];
        
        unsigned char digest[CC_MD5_DIGEST_LENGTH];
        
        CC_MD5( cStr, (CC_LONG)self.length, digest );
        
        NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
        
        for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
            [result appendFormat:@"%02X", digest[i]];
        
        return result;
    }
    
    // 加盐
    - (NSString *)MD5_saltStr:(NSString *)saltStr {
        
        saltStr = [saltStr stringByAppendingString:salt];
        
        NSString *result =[saltStr MD5_32BIT];
        
        return result;
    }
    
    // 多次加密
    - (NSString *)MD5_againStr:(NSString *)againStr {
        
        NSString *result = [againStr MD5_32BIT];
        
        result = [result MD5_32BIT];
        
        return result;
    }
    
    // 乱序加密
    - (NSString *)MD5_Chaos:(NSString *)chaosStr {
        
        NSString *result =[chaosStr MD5_32BIT];
        
        NSString *header =[result substringFromIndex:2];
        
        NSString *footer=[result substringFromIndex:2];
        
        result =[footer stringByAppendingString:header];
        
        return result;
        
    }
    
    
    #pragma mark -  16位
    - (NSString *)MD5_16BIT{
    
        NSString * md5Str = [self MD5_32BIT];
        NSString  *string;
        for (int i=0; i<24; i++) {
            string=[md5Str substringWithRange:NSMakeRange(8, 16)];
        }
        return string;
    }
    
    @end
    
    

    调用

       NSString *string = @"明天,就在前方";
        // 调用 MD5 加密并打印结果
        NSLog(@"MD5Result       = %@", [string MD5_32BIT]);
        NSLog(@"MD5_saltResult  = %@", [string MD5_saltStr:string]);
        NSLog(@"MD5_againResult = %@", [string MD5_againStr:string]);
        NSLog(@"chaosResult     = %@", [string MD5_Chaos:string]);
    
    

    大家应该都知道有一个MD5破解网站,名字叫做 md5在线解密加密,因此我们在使用MD5加密的时候,最好使用多次加密,加盐,乱序加密等,不然会很容易被破解

    相关文章

      网友评论

        本文标题:关于MD5记录

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