密码学HASH与对称加密

HASH概述:

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。2004年,证实MD5算法无法防止碰撞(collision)(如网站:CMD5),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5是哈希算法的一种。

Hash的特点:

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

Hash的用途:

  • 用户密码的加密:服务器没有必要保存用户的真实密码,只是保存密码的哈希值,防止用户密码被泄露,业务上一般也只有重置密码功能,没有找回密码功能

  • 搜索引擎:是将关键字的哈希值相加,进行匹配的,因为分别都是128位的二进制,不管怎么排列组合,相加过后的结果都是一样的。这样搜索
    的时候,哪怕关键字顺序不一样,搜索的结果也是一样的。

  • 版权:正版的哈希值和盗版的哈希值是不一样的。因为哈希值是根据二进制数据来哈希的,只有二进制改变,如压缩,哈希值才能改变,复制并不会改变哈希值。

  • 百度云:有秒传功能,是因为传递的时候,他会在云上匹配哈希值,如果有哈希值一样,并且后缀名那些也一样的话,就不用再传了。

  • 数字签名:客户端将原始数据和原始数据哈希值过后RSA加密过后的密文一起传给服务器,服务器将密文解密过后得到哈希值,并与传过来的原始数据哈希过后的哈希值进行匹配,如果匹配原始数据就是没有被篡改过。如果不匹配就是被篡改过了。用RSA包装的原始数据哈希值的过程,叫做数字签名

密码加密

密码加密常见的有以下几种方式:

  • 直接使用MD5:不安全,直接使用MD5可以通过MD5碰撞,破解出密码
  • MD5加盐:当盐泄露过后,也就不安全了
  • HMAC加密方案:比较好的加密方案,简单来说是使用一个密钥加密,并且做了两次散列,在实际开发中,密钥来自于服务器,并且每个账号匹配一个
  • HMAC加密方案并添点东西(如时间戳等):当使用HMAC加密方案过后,再添点东西进行哈希

HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。

HMAC的应用
image.png

如上图中,共有两个流程:

授权设备登录流程:
1、输入账号过后,就把账号作为参数向服务器发送请求
2、服务器根据账号生成对应的key,并传递给客户端
3、客户端拿到key,进行HMAC运算,并将运算结果的哈希值传给服务器

其他设备登录流程:
1、输入账号过后,在本地缓存中找服务器传过来的key,有就登录,没有就把账号作为参数向服务器发送请求
2、服务器要先看这个账号是否开启了设备锁,没有开启就不允许登录,开启了,就向授权设备发送请求,是否授权,如果授权,就将这个账号的key传给其他客户端
3、客户端拿到key,进行HMAC运算,并将运算结果的哈希值传给服务器

但是在这之中有一个潜在的安全隐患问题:当别人拿到账号和传递的哈希值过后,也就能拿到登录权限,从而不安全。

所以这个时候不仅需要HMAC加密,还需要添点东西了,如下:


image.png

为了防止上面的问题,注册流程不变,服务器还是保存的有加了key的HMAC哈希值。
1、只是登录的时候,客户端将哈希值与时间戳拼接过后,进行MD5加密,再传给服务器。
2、服务器将注册保存的账号对应的HMAC哈希值,分别与当前时间,和前一分钟拼接再MD5加密,再和客户端传过来的进行匹配,匹配成功则登录成功,否则不成功。
3、注意这里的时间戳是服务器给的时间戳。

注意:
关于密码安全还需注意的是密码和指纹,人脸的关系:
密码:你是这个账号的主人!
人脸、指纹:你是这个手机的主人!
支付宝那些是登录成功过后,开通指纹识别

对称加密

常见的加密算法:

  • DES 数据加密标准(用得少,因为强度不够)
  • 3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
  • AES 高级密码标准(一般都用这个,苹果的钥匙串访问等)AES 加密算法的原理详解。

应用模式:

  • ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。

    • 最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
  • CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。

    • 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。

    • CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密。

加密的终端命令:
  • DES加密的ECB模式下,将message.txt加密,输出为msg1.bin
    $ openssl enc -des-ecb -K 616263 -nosalt -in message.txt -out msg1.bin

  • DES加密的CBC模式下,将message.txt加密,输出为msg3.bin
    $ openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -in message.txt -out msg3.bin

  • AES(ECB)加密“hello”字符串
    $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
    AES(ECB)解密
    $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d

  • AES(CBC)加密“hello”字符串
    $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
    AES(CBC)解密
    $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d

加密过程是先加密,再base64编码
解密过程是先base64解码,再解密

CCCrypt函数

AES加密解密都是用到的CCCrypt函数,并且需要导入CommonCrypto框架。

 /**
     1、kCCEncrypt 加密/kCCDecrypt 解密
     2、加密算法。
     3、加密选项:ECB/CBC
     4、加密的密钥
     5、密钥的长度
     6、iv 初始化向量
     7、加密的数据
     8、加密的数据长度
     9、密文的内存地址
     10、密文缓冲区的大小
     11、加密结果大小
     */
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          self.algorithm,
                                          option,
                                          cKey,
                                          self.keySize,
                                          cIv,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize);
    ```

你可能感兴趣的:(密码学HASH与对称加密)