美文网首页
Hash&对称加密

Hash&对称加密

作者: coder_feng | 来源:发表于2020-04-18 11:54 被阅读0次

    Hash的特点

    • 算法是公开的
    • 对相同数据运算,得到的结果是一样的
    • 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)
    • 无法逆运算
    • 信息摘要,信息指纹,是用来做数据识别的

    Hash用途

    • 用户密码的加密
    • 用户引擎
    • 版权
    • 数字签名

    密码加密

    • 直接使用MD5
    • MD5加盐
    • HMAC加密方案
    • 添点东西

    对称加密

    对称加密方式:明文通过密钥加密得到密文,密文通过密钥解密得到明文
    
    常见算法
    • DES 数据加密标准(用得少,因为强度不够)
    • 3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
    • AES 高级密码标准

    应用模式

    • ECB(Electronic Code Book):电子密码本模式,每一块数据,独立加密,是最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况很少使用

    • CBC(Cipher Block Chaining):密码分组链接模式,使用一个密钥和一个初始化向量[IV]对数据进行加密,明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始化向量,相同的密文加密后悔形成不同的密文,这是目前应用最广泛的模式,CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误),另外CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。

    OpenSSL 操作

    AES (ECB)加密 "hello" 字符串

    echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
    

    AES(CBC)加密"hello"字符串

    echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
    

    解密:

    AES(ESC)解密

    echo -n d1QG4T2tivoOKiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
    

    AES(CBC)解密
    ···
    echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc-iv 0102030405060708 -K 616263 -nosalt -d
    ···

    安全隐患

     /** AES - ECB */
        NSString * key = @"abc";
        NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:nil];
        
        NSLog(@"加密的结果是:%@",encStr);
        
        NSLog(@"解密的结果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:nil]);
        
        /** AES - CBC 加密 */
        uint8_t iv[8] = {1,2,3,4,5,6,7,8};
        NSData * ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
        
        
        
        NSLog(@"CBC加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:@"abc" iv:ivData]);
        
        NSLog(@"解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"u3W/N816uzFpcg6pZ+kbdg==" keyString:key iv:ivData]);
    

    这两种加密,底层使用的都是CCCrypt 这个方法

    CCCryptorStatus CCCrypt(
        CCOperation op,         /* kCCEncrypt, etc. */
        CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */
        CCOptions options,      /* kCCOptionPKCS7Padding, etc. */
        const void *key,
        size_t keyLength,
        const void *iv,         /* optional initialization vector */
        const void *dataIn,     /* optional per op and alg */
        size_t dataInLength,
        void *dataOut,          /* data RETURNED here */
        size_t dataOutAvailable,
        size_t *dataOutMoved)
        API_AVAILABLE(macos(10.4), ios(2.0));
    

    CCCrypt 对称加密算法的核心函数(负责加密解密)

    • 参数1.kCCEncrypt 加密/kCCDecrypt解密
    • 参数2.加密算法,默认的AES/DES
    • 参数3:加密方式的选项 kCCOptionPKCS7Padding | kCCOptionECBMode;//ECB 加密! kCCOptionPKCS7Padding;//CBC加密
    • 参数4.加密密钥
    • 参数5.密钥长度
    • 参数6.iv初始化向量,ECB不需要指定
    • 参数7.加密的数据
    • 参数8.加密的数据长度
    • 参数9.缓冲区(地址).存放密文的
    • 参数10.缓冲区的大小
    • 参数11.加密结果大小
    现在模拟一下安全测试隐患,在xcode中设置Symbolic BreakPoint断点CCCrypt,如下图所示 Snip20200422_12.png
    然后运行项目,会发现项目停留在 Snip20200422_13.png
    这个时候,通过终端界面,打印出相关值情况 Snip20200422_15.png
    可以看到,别人可以通过逆向hook住某个方法,然后就可以将我的加密内容给打印出来,针对这个问题,我们可以在加密之前先对我们要加密的字符串进行一些处理,例如异或呀,md5,HMAC + 时间戳等处理,然后再传递进去,这样的话,就可以降低我们的安全隐患.

    总结

    • Hash
      • 特点
        • 算法公开
        • 相同的数据加密结果不变,不同的数据加密结果定长
        • 不可逆
      • HASH用途
        • 密码加密:服务器不需要知道用户真实密码,只需要匹配HASH值
          • 直接MD5,轻易反查询
          • 加盐,不要使用定盐
          • HAMC加密方案:通过动态KEY来加密数据
          • 加时间戳的方式,更加灵活,可以保证加密的结果每次不同
      • 数字签名
        • 原始数据进行HASH
        • 使用RSA加密HASH值(这部分数据就是原始数据的签名信息)
        • 将原始数据+数字签名,一起发给服务器验证
    • 对称加密算法
      • 两种加密方式
        • ECB:电子密码本,每一块数据独立加密
        • CBC: 链式加密,每一块数据加密都依赖上一块数据。有效的保证数据的完整性
    • CCrypt函数:直接使用会有安全隐患

    相关文章

      网友评论

          本文标题:Hash&对称加密

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