iOS逆向(2)-密码学(Hash&对称加密)

1,352 阅读4分钟

在上一篇文章,讲述了非对称加密,也就是RSA的数据原理和简单实用,那么在这篇文章将要讲述的就是对称加密,其中以Hash(散列算法,哈希函数)最为广为人知。

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

接下来本文会从以下几点进行阐述:

  • Hash的特点
  • Hash的用途
  • 对称加密

1、Hash的特点

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

2、Hash的用途

①、用户密码的加密
②、搜索引擎
③、版权
④、数字签名

下面概述密码加密和数字签名的内容

1、密码加密

Step 1

密码加密需要确保服务端没有保留保存用户的明文密码,所以过程很安全的RSA就不适合用户密码加密。

Step 2 普通HASH

普通的Hash因为存在散列碰撞的问题,所以简单的对密码HASH(例如MD5),肯定不够安全。推荐网站:反MD5网站

Step 3 固定盐

既然简单的Hash不安全那么进一步可以想到将密码通过固定的算法转换一次,在进行Hash,也就是我们俗称的加盐。这种方法看似安全,但由于算法固定,那么实际上接触过这个算法的人员还是蛮多的,就比如写这串算法的程序员,一旦程序员离职,那么算法也就变的不在安全。

Step 4 动态盐(HMAC)

固定的算法不行,那么就改成动态的算法,算法参数由服务器针对个人下发,那么无论谁的离职也都不影响算法的私密性。这样虽然保护了用户的明文密码,但是黑客通过中间人攻击的形式还是可以获取服务器返回给我们的用户token,那么黑客还是可以每次通过这个token来获取该用户的信息,所以还是不够安全。

Step 5 动态盐(HMAC)+ 时间戳

最后,就是要让每次用户的token不一样,那么可以采用,动态盐+时间戳的方式进行最终的验证。 也就是((HMAC哈希值)+”201902281250”).md5 最终服务端用也用同样的的方式校验,唯一不一样的是考虑到服务传递的延时,时间戳也要考虑到上一分钟的情况。

动态盐+时间戳.png

2、数字签名

一张图讲解数字签名

数字签名.png

3、对称加密

对称加密含义

常用的对称加密分为三种:

方式 含义
DES 数据加密标准(用得少,因为强度不够)
3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
AES 高级密码标准

其中AES为现在的的主流加密方式,AES有具体分为ECB和CBC两种加密模式: ECB(Electronic Code Book):电子密码本模式。每一块数据,独立加密。 最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。

CBC(Cipher Block Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。 明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。

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

对称加密终端命令:

加密:

// 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(ECB)解密
$ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | 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