美文网首页
06、数据安全

06、数据安全

作者: 深爱久随i | 来源:发表于2016-12-21 17:33 被阅读0次
    一、常用术语
    • 密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称秘钥。
    • 明文:没有进行加密,能够直接代表原文含义的信息
    • 密文:经过加密处理之后,隐藏原文含义的信息
    • 加密:将明文转换成密文的实施过程
    • 解密:将密文转换成明文的实施过程
    二、MD5

    MD5:名为消息摘要算法第五版,为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
    MD5算法的特点:

    • 压缩性:任意长度的数据,算出的MD5值长度都是固定的128位 二进制,32位 十六进制。
    • 容易计算:从原数据计算出MD5值很容易。
    • 抗修改性:对源数据进行任何改动,哪怕只改一个字节,所得到的MD5值都有很大差别。
    • 强抗碰撞:已知源数据及其MD5值,想找到一个具有相同MD5值的数据是非常困难的。
      使用MD5加密时,首先要引入<CommonCrypto/CommonCrypto.h>头文件,在进行如下操作,例如对NSString类型进行加密
    #import <CommonCrypto/CommonCrypto.h>//加密相关的头文件
    
    //MD5对字符串进行加密  128位的二进制,   32位 十六进制
    -(void)md5MethodWithSourceingString:(NSString*)sourceString{
       
       //用的是c语言的函数进行的加密,所以我们需要将字符串转换为c语言字符串
       const char* str = sourceString.UTF8String;
       //声明一个c语言的字符数组用来存放加密之后的所有字符
       unsigned char result[CC_MD5_DIGEST_LENGTH];
       //MD5加密
       //第一个参数:要加密的源字符串
       //第二个参数:要加密的字符串的长度
       //第三个参数:用来接收加密好的字符的容器
       CC_MD5(str, (CC_LONG)strlen(str), result);
      //将加密好的字符数组中的字符转为16进制的字符串以供使用
       NSMutableString* resultStr=[[NSMutableString alloc] init];
       for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
           //将c语言字符转换为16进制的字符串
           [resultStr appendFormat:@"%02x",result[i]];
       }
       NSLog(@"md5----%@",resultStr);
    }
    

    使用MD5对NSData类型的数据进行加密,例如加密图片

    //用MD5对NSData类型进行加密
    -(void)md5WithsourceData:(NSData*)sourceData{
        //创建MD5变量
        CC_MD5_CTX md5;
        //初始化MD5变量
        CC_MD5_Init(&md5);
        //准备MD5加密
        //第一个参数就是MD5变量取地址
        //第二个参数就是要进行加密的数据 bytes是将NSData转换为c语言的二进制类型
        //第三个参数就是数据长度
        CC_MD5_Update(&md5, sourceData.bytes, (CC_LONG)sourceData.length);
        //结束MD5加密
        // 接收加密好的数据容器
        unsigned char result[CC_MD5_DIGEST_LENGTH];
        CC_MD5_Final(result, &md5);
        NSMutableString* resultStr=[[NSMutableString alloc] init];
        for (int i=0; i<CC_MD5_DIGEST_LENGTH; i++) {
            [resultStr appendFormat:@"%02X",result[i]];
        }
        NSLog(@"MD5png-------%@",resultStr);
     
    }
    
    三、SHA-1

    SHA1安全散列算法(英语:Secure Hash Algorithm)是一种能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。
    例如SHA-1对字符串进行加密

    //SHA-1加密  160位 二进制     40位 十六进制
    -(void)shaMethodWithSourceingString:(NSString*)sourceString{
        //用的是c语言的函数进行的加密,所以我们需要将字符串转换为c语言字符串
        const char* str = sourceString.UTF8String;
        //声明一个c语言的字符数组用来存放加密之后的所有字符
        unsigned char result[CC_SHA1_DIGEST_LENGTH];
        CC_SHA1(str, (CC_LONG)strlen(str), result);
         NSMutableString* resultStr=[[NSMutableString alloc] init];
        for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
            [resultStr appendFormat:@"%02x",result[i]];
        }
          NSLog(@"sha-1-------%@",resultStr);
        
    }
    

    SHA-1对NSData类型的数据进行加密,这里加密图片

    //用SHA-1对NSData类型进行加密
    -(void)shaWithsourceData:(NSData*)sourceData{
        //创建MD5变量
        CC_SHA1_CTX sha;
        //初始化MD5变量
        CC_SHA1_Init(&sha);
        //准备MD5加密
        CC_SHA1_Update(&sha, sourceData.bytes, (CC_LONG)sourceData.length);
        //结束MD5加密
        unsigned char result[CC_SHA1_DIGEST_LENGTH];
        //结束加密
        CC_SHA1_Final(result, &sha);
        NSMutableString* resultStr=[[NSMutableString alloc] init];
        for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
            [resultStr appendFormat:@"%02X",result[i]];
        }
        NSLog(@"SHApng-------%@",resultStr);
      
    }
    
    四、钥匙串加密

    钥匙串(英文:Keychain)是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中被导入,并且包括在了所有后续的Mac OS版本中,包括Mac OS X。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。KeyChain是一种对称加密
    (1)首先拖入KeychainItemWrapper的.m和.h文件
    (2)在工程的Build Phases设置的Compile Sources下给KeychainItemWrapper.m后面加上-fno-objc-arc,让这个非arc的类可以在arc工程下编译
    (3)在Link Binary With Libraries下面加上Security.framework

    Snip20161221_1.png

    接下来进行加密就可以了

    //钥匙串加密
    //一般用在保存我们不希望发生变化的数据,例如应用程序的UUID,在iOS7之后,我们将应用程序卸载重装,应用程序的UUID可能会发生变化,我们不希望它一直变化,就可以将UUID存储在钥匙串中
    -(void)keychain{
        //初始化工具类
        //第一个参数:当前工具的标识符,为了取值的时候,可以根据标识符找到对应的工具
        //第二个参数:一般填工程的唯一标识符,一般是用来区分是哪个工程所保存的数据
        KeychainItemWrapper* key=[[KeychainItemWrapper alloc] initWithIdentifier:@"yf" accessGroup:@"com.xalo.Test-01.Senior-secret-YF"];
        //存储用户名和密码
        //使用和字典基本一致,但是key必须使用系统提供的,不能自己定义
       [key setObject:@"用户名" forKey:(__bridge id)kSecAttrAccount];
       [key setObject:@"密码" forKey:(__bridge id)kSecValueData];
        
        //清除钥匙串中存储的数据
       // [key resetKeychainItem];
        NSString* userName= [key objectForKey:(__bridge id)kSecAttrAccount];
        NSLog(@"%@",userName);
        NSString* passWord= [key objectForKey:(__bridge id)kSecValueData];
        NSLog(@"%@",passWord);
       
    }
    

    相关文章

      网友评论

          本文标题:06、数据安全

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