iOS加密那些事

网络开发中,大多都有用户登录的操作,用户隐私就显得很重要!

常用加密有三种方式 :

  - 哈希(散列)函数      我们熟知的 MD5 加密

  - 对称加密算法 

      - DES

      - 3DES

      - AES(高级密码标准,美国国家安全局使用的,iOS系统使用的加密方式(钥匙串))

- 非对称加密算法    RSA加密



散列函数

特点:

    - 算法公开的.

    - 对相同的数据加密,得到的结果是一样的.

    - 对不同的数据加密,得到的结果是定长的,MD5对不同的数据进行加密,得到的结果都是32个字符.

    - 信息摘要,信息"指纹",是用来做数据识别的.

    - 不能反算的.

MD5 加密:

      因为不能反算的特性,以及不同的数据 MD5 之后差别是非常大的!!经常是用来检验数据

      当然,因为 MD5 对于同样的数据加密,得到的结果永远是相同的,所以,也是可以被破解出来的  --- 散列碰撞,找出不同的数据使用MD5之后能够得到相同的结果!

MD5 的基本安全:

 1.加"盐"- 早期使用!

 2.HMAC,近一两年,在国内开始使用增多!

        给定一个密钥,对明文进行密钥拼接,并且做"两次散列"-> 得到32位结果!

HMAC :

    - 用户在注册的那一刻,向服务器索取 密钥(key)!!

    - 客户端拿到KEY的这一刻,就将KEY保存在本地!!

    - 切换了新的设备(换手机登录,登录新的已有账号!) -- 重新找服务器获取!!


还有一种情况:

      如果黑客 模拟你的网络请求..不需要拿到真实密码!用加密后的信息,也可以获得登录之后的权限!

避免方式 -- 增加参数时效性! 网络请求超时 一般不会有超过 60s 的 可以使用 

MD5(数据+时间) 的方式与后台交互,只要服务器当前时间或者上一分钟 加密后的字符相等!就可以返回数据



对称加密 - 传统加密算法

    - 加密和解密使用同一个"密钥"!

    - 密钥的保密工作就非常的重要!! 密钥会定期更换!密钥的管理很重要!!

    经典算法

    - DES  数据加密标准(用的比较少,因为强度不够).

   - 3DES 使用3个密钥,对相同的数据执行三次加密,强度增强.

    - AES  高级加密标准,目前美国国家安全局使用AES加密,苹果的钥匙串访问就是使用

           AES加密

    两种加密方式: ECB和CBC

    ECB: 电子代码本,就是将一个数据拆分为多块,然后独立加密的!

    CBC: 密码块链,使用一个密钥和一个初始化"向量"对数据执行加密抓换

        能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏!

    向量:某个方向的数量.

    现代的密码学都和几何有关!因为几何(包含圆形\椭圆\球体)的变量是有规律的,但是结果是多变的!

 非对称加密(RSA) - 现代加密算法

    - 公钥\私钥

    - 用公钥加密,私钥解密

    - 用私钥加密,公钥解密

    - 优点: 安全   缺点:速度慢

RSA加密计算量很大! 一般是用来对AES加密后的小数据进行加密!

RSA数字签名原理:

 生成数据-->把数据进行MD5加密-->对MD5进行RSA加密-->发给服务器-->服务器对数据进行MD5加密-->服务器对RSA加密的数据进行解密-->对比两个数据,判断是否准确!


写点实用的:  -- 对称加密代码

   // 设置秘钥

    NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];

    uint8_tcKey[self.keySize];

    bzero(cKey,sizeof(cKey));

    [keyDatagetBytes:cKeylength:self.keySize];


    // 设置iv

    uint8_tcIv[self.blockSize];

    bzero(cIv,self.blockSize);

    intoption =0;

    if(iv) {

        [ivgetBytes:cIvlength:self.blockSize];

        option =kCCOptionPKCS7Padding;

    }else{

        option =kCCOptionPKCS7Padding | kCCOptionECBMode;

    }


    // 设置输出缓冲区

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

    size_tbufferSize = [datalength] +self.blockSize;

    void*buffer =malloc(bufferSize);


    // 开始加密/解密

    size_tdecryptedSize =0;

    CCCryptorStatuscryptStatus =CCCrypt(kCCDecrypt,

                                          self.algorithm,

                                          option,

                                          cKey,

                                          self.keySize,

                                          cIv,

                                          [databytes],

                                          [datalength],

                                          buffer,

                                          bufferSize,

                                          &decryptedSize);


    NSData*result =nil;

    if(cryptStatus ==kCCSuccess) {

        result = [NSDatadataWithBytesNoCopy:bufferlength:decryptedSize];

    }else{

        free(buffer);

        NSLog(@"失败|状态编码: %d", cryptStatus);

    }


   NSString * resultStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];


主要用到的是

CCCryptorStatus CCCrypt(

    CCOperationop,        /* kCCEncrypt, etc. */

    CCAlgorithmalg,        /* kCCAlgorithmAES128, etc. */

    CCOptionsoptions,      /* kCCOptionPKCS7Padding, etc. */

    constvoid*key,

    size_tkeyLength,

    const void*iv,        /* optional initialization vector */

    const void*dataIn,    /* optional per op and alg */

    size_tdataInLength,

    void*dataOut,          /* data RETURNED here */

    size_tdataOutAvailable,

    size_t*dataOutMoved)

    __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);


     参数:

     1.kCCEncrypt  加密/kCCDecrypt 解密

     2.加密算法,默认使用的是  AES/DES

     3.加密选项  ECB/CBC 

         kCCOptionPKCS7Padding                      CBC 的加密方式

         kCCOptionPKCS7Padding | kCCOptionECBMode   ECB 的加密方式

     4.加密密钥

     5.密钥长度

     6.iv 初始化向量,ECB 不需要指定

     7.加密的数据

     8.加密的数据的长度

     9.密文的内存地址

     10.密文缓冲区的大小

     11.加密结果大小

你可能感兴趣的:(iOS加密那些事)