入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

iOS MD5 和 Base64加密

创建时间:2016-11-11 投稿人: 浏览次数:2716
  • 加密相关
    网络应用程序数据的原则:
    1.在网络上“不允许”传输用户隐私数据的“明文”
    2.在本地“不允许”保存用户隐私数据的“明文”

在网络发展趋势日渐迅猛的今天,数据的安全性也越来越重要。因此,如何保证用户数据的安全就成为了我们不得不考虑的一个问题。在iOS中最常见的两种加密方式是base64加密码和MD5加密。base64加密属于可逆性的加密,意思就是既可以加密,也可以解密。而MD5加密属于不可逆性的加密,只能够给我们提供加密的方式,却没有解密的方式,一般情况多应用与登录注册界面。

MD5 加密

MD5加密全称是Message Digest Algorithm 5,翻译为“消息摘要算法第五版”

MD5加密是最长用的加密方式之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位的散列值(32字符)

MD5生成的是固定的128bit,即128个0和1的二进制位,而在实际应用开发中通常是以16进制输出的,所以正好就是32位的16进制,说白了就是32个16进制的数字。

MD5主要特点是不可逆,相同的数据的MD5值肯定一样,不同数据的MD5值不一样(也不是绝对的,但基本是不可能一样的)。

MD5算法还具有以下性质

  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的
  • 用以计算:从原数据计算出MD5值很容易
  • 抗修改性:队员数据进行任何改动,哪怕只修改一个字节,所得到的MD5值都有很大区别。
  • 弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同的MD5值的数据是非常困难的
  • 强抗碰撞;想找到两个不同的数据使他们的MD5值相等是非常困难的

  • MD5加密是不可解密的,但是网上有一些解析MD5的,那个相当于一个大型的数据库,通过匹配MD5去找原密码。所以,只要在加密的字符串前面加上一些字母数字符号或者多次MD5加密,这样出来的结果一般是解析不出来的

MD5的应用

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

注意点:

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

    MD5解密:

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

为了让MD5更加安全,涌现了很多其他方法,如加盐,盐要足够长足够乱,得到的MD5就很难查到。

终端代码:$ echo -n abc|openssl md5 给字符串abc加密

苹果包装了MD5加密的算法,使用起来十分方便

#import@interface MD5Encrypt : NSObject
// MD5加密
/*
*由于MD5加密是不可逆的,多用来进行验证
*/
// 32位小写
+(NSString *)MD5ForLower32Bate:(NSString *)str;
// 32位大写
+(NSString *)MD5ForUpper32Bate:(NSString *)str;
// 16为大写
+(NSString *)MD5ForUpper16Bate:(NSString *)str;
// 16位小写
+(NSString *)MD5ForLower16Bate:(NSString *)str;
@end
#import "MD5Encrypt.h"
#import <CommonCrypto/CommonDigest.h>

@implementation MD5Encrypt

#pragma mark - 32位 小写
+(NSString *)MD5ForLower32Bate:(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 - 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

Base64 加密

  1. Base64简单说明
    描述:Base64可以称为密码学的基石,非常重要
    特点:可以讲任意的二进制数据进行Base64编码
    结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件
    65字符:A~Z a~z 0~9 + / =
    对文件进行base64编码后文件数据的变化:编码后的数据约等于编码前数据的三分之四,会大三分之一左右
  2. 命令行进行Base64编码和解码
    编码:base64 123.png -o 123.txt
    解码:base64 123.txt -o test.png -D
  3. Base64编码原理
    1)将所有的字符转化为ASCII码;
    2)将ASCII码转化成8位二进制;
    3)将二进制3个规程一组(不足三个在后边补0)共24位,再拆分成4组,每组6位;
    4)统一在6位二进制前补两个0凑足8位;
    5)将补0后的二进制转换成十进制
    6)从Base64编码表获取十进制对应的Base64编码;
  4. 处理过程说明
    a.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区域,先来的byte占高位。
    b.数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
    c.不断进行。知道全部输入数据转换完成
    d.如果最后剩下两个输入数据。在编码结果后加一个“=”
    e.如果最后剩下一个数据,在编码结果后加2个“=”
    f.如果没有剩下任何数据,就什么都不要加,这样才可以保资料还原的正确性
  5. iOS实现
    a. 说明:从iOS7.0开始,苹果就提供了base64的编码和解码支持 ,如果是老项目还能看到Base64编码和解码的第三方框架如果不支持iOS7.0请替换
    b.相关代码
//给定一个字符串,对该字符串进行Base64编码,然后返回编码后的结果

    -(NSString *)base64EncodeString:(NSString *)string

    {

        //1.先把字符串转换为二进制数据

        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];



        //2.对二进制数据进行base64编码,返回编码后的字符串

        return [data base64EncodedStringWithOptions:0];

    }



    //对base64编码后的字符串进行解码

    -(NSString *)base64DecodeString:(NSString *)string

    {

        //1.将base64编码后的字符串『解码』为二进制数据

        NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:0];



        //2.把二进制数据转换为字符串返回

        return [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    }

c.终端测试命令

    $ echo -n A | base64
    $ echo -n QQ== |base64 -D

这样 我们就知道 我们就可以 用Base64加密 然后再给Base64生成的文本文件进行MD5加密 这样基本上没法破解了

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像