iOS逆向与安全1.1 :HASH、对称加密
HASH
简述:
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数
特点
- 算法是公开的
- 对相同数据运算,得到的结果是一样的
- 对不同数据运算,如MD5得到的结果默认是128位,32个字符(16进制标识)。
- 无法进行逆运算
- 信息摘要,信息“指纹”,是用来做数据识别的。电子签名等等
用途
-
用户密码的加密
通过运用HASH算法,给用户的密码进行加密。
密码加密的方式
1.直接使用MD5
2.MD5加盐
3.HMAC加密方案
4.添点东西 -
搜索引擎
-
版权。
-
数字签名(HASH+RSA)
用于鉴别数字信息的方法 用于证明数字信息的真伪
对称加密
简述:
对称加密方式:明文通过密钥加密得到密文。密文通过密钥解密得到明文。
常见算法
-
DES 数据加密标准(强度不够,使用较少)
-
3DES 使用3个密钥,对相同的数据执行3次加密,强度增强
-
AES 高级密码标准
应用模式 加密方案 ECB&CBC (iV 向量)
-
ECB(ElectronicCode Book):电子密码本模式。每一块数据,独立加密。
特点:效率高,速度快最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用
-
CBC(CipherBlock Chaining):密码分组链接模式。使用一个密钥和一个初始化向量[IV]对数据执行加密。
特点:安全
明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加密后的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)
CBC可以有效的保证密文的完整性,如果一个数据块在传递是丢失或改变,后面的数据将无法正常解密
PS:异或运算
异或,英文为exclusive OR,缩写成xor
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
异或略称为XOR、EOR、EX-OR
程序中有三种演算子:XOR、xor、⊕。
使用方法如下
z = x ⊕ y
z = x xor y
与其它语言不同,C语言和C++语言的异或不用xor,而是用“^”,键入方式为Shift+6。(而其它语言的“^”一般表示乘方)
若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:
void swap(int &a,int &b)
{
a=a^b;
b=b^a;
a=a^b;
}
详解:
a1=a^b
b=b^a1=b^a^b=a
//此时a1=a^b b=a
a=a1^b=a^b^a=b
注意:
1
a=a^b^(b=a);//此类形式是不正确的UB行为,在不同编译器中会有不同的结果,切勿使用
这样就完成了a与b的交换。
综上:同一变量与另一变量和其异或值异或等于另一个数,如(a^b)^b=a。
用例:可使用于加密算法某一环节或更多环节,使算法更复杂,不易被破解,安全性更高。
终端命令:
•加密:
•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 -nu3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc-aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt –d
CCCrypt函数 数据加密之前,对数据本身处理一下,异或等等,