HASH
HASH
,译为散列
,音译为哈希
把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是说,散列值的空间通常远小于输入值的空间,不同的输入可能会散列成相同的输出,所以不可能通过散列值来确定唯一的输入值。简单来说,就是将任意长度的消息压缩到某一固定长度的消息摘要
-
哈希有如下特点:
- 算法公开
- 对相同数据运算,得到的结果是相同的
- 对不同数据运算,如
MD5
,得到的结果默认都是128
位,32
个字符(16
进制) - 无法进行逆运算
- 信息摘要,用于做数据识别
-
HASH
算法举例MD5
128位,32个16进制字符SHA1
160位,40个16进制字符SHA256
256位,64个16进制字符
-
从
iOS 13.0
开始,苹果建议废弃MD5
,改用SHA256
或更安全的加密。 -
对称加密算法举例
DES
使用较少,强度低。3DES
使用3个秘钥,对原始数据进行3次加密,无意义AES
高级加密标准,普遍使用。苹果钥匙串访问,美国安全局等都在使用
-
HASH
算法用途- 用户密码的加密
- 搜索引擎
- 版权
- 数字签名
-
用户密码的加密
- 用户注册时,服务器直接存储密码的
HASH
值 - 用户登录时,将密码以
HASH
形式传递给服务器 - 由于同一对象的
HASH
值永远相同,现在有很多万亿条、PB级的HASH
大数据库,可以通过HASH
查询出原值。 - 多次嵌套
HASH
或者加盐处理,也会被大数据库碰撞查询出答案(嵌套可以递归碰撞,盐会泄露)
- 用户注册时,服务器直接存储密码的
-
更安全的
HMAC
加密方案- 使用一个秘钥进行加密,进行两次散列运算,实际开发中,秘钥来自于服务器。
- 秘钥在注册时由服务器对应账号生成,并下发给客户端。
- 秘钥可以用于开启设备锁,如果本地没有秘钥,向服务器索要,服务器可以判断是否下发,如果开启了设备锁,需要在原设备进行操作。
-
注意,
HAMC
加密方案处理后的值,在网络传输中依然可以被拦截,此时仍然不安全。 -
更安全的方案:
- 用户登录时,将
HAMC
加密后的密码拼接上时间戳(截止到分钟位)再进行一次MD5
加密,服务器收到请求以后,从库中去除用户的HASH
密码,拼接服务器时间戳进行一次MD5
加密,如果服务器结果与客户端不匹配,那么服务器就将时间戳前移一分钟,再次进行匹配,如果成功则允许登录。 - 此种方案下,用户的
HASH
密码有效时间最长只有1分59秒
,可以防止被网络拦截造成隐患。
- 用户登录时,将
-
搜索引擎
- 搜索引擎的拆次搜索,每一个词的
HASH
相加,无论顺序,结果相同。
- 搜索引擎的拆次搜索,每一个词的
-
版权
- 云盘类应用,上传数据时,如果与云端资源
HASH
值相同,再进行一系列算法(因为云端资源庞大,而HASH
值可能发生碰撞,即数据不同,HASH
值相同),如文件二进制前中后各N
位进行对比,文件格式对比等,如若匹配成功,可以认定为相同数据,直接完成秒传(引用统一资源)。 - 用户上传资源时,原文件的
HASH
值,可以用于所有权的校验。 HASH
值是对文件的二进制数据进行运算,修改文件名不会对HASH
值有任何影响。- 压缩文件的
HASH
值会发生变化,因为文件的二进制发生了变化,复制的文件HASH
不会变。
- 云盘类应用,上传数据时,如果与云端资源
-
数字签名
- 将原始数据的
HASH
值进行RSA
加密,将加密后的HASH
值与原始数据一起传递给服务器。 - 服务器拿到数据后,对原始
HASH
值进行RSA
解密,如果解密后的HASH
值与客户端传递过来的数据的HASH
值匹配,那么原始数据就是未经篡改的,否则原始数据是被篡改过的,服务器需要拒绝响应。 - 这种用
RSA
加密后的HASH
值,就是数字签名。
- 将原始数据的
-
对称加密(传统加密)
-
应用模式
ECB
(Electronic Code Book
): 电子密码本模式,每一块数据,独立加密。- 最基本的加密模式,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少使用。
CBC
(Cipher Block Chaining
): 密码分组链接模式,使用一个秘钥和一个初始化向量对数据进行加密。- 明文在加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的明文加密后会形成不同的密文,这是目前最广泛的加密模式。
CBC
加密后的密文是上下文相关的,明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。 CBC
可以有效保证密文的完整性,如果一个数据在传输时丢失或被篡改,后面的数据将无法进行正常解密。
- 明文在加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的明文加密后会形成不同的密文,这是目前最广泛的加密模式。
-
终端体验加密
openssl enc -des-ecb -K 123 -nosalt -in before.txt -out after.bin
DES加密,ECB模式,key为123,不加盐openssl enc -des-cbc -iv 0102030405060708 -K 123 -nosalt -in before.txt -out after.bin
DES加密,CBC模式,key为123,初始向量为0102030405060708,不加盐- 参数增加
-d
为解密
-
iOS中的对称加密
#import <CommonCrypto/CommonCrypto.h>
iOS中处理加密与解密的库CCCrypt
: iOS中用于加密与解密的函数,如下:
CCCryptorStatus CCCrypt(
CCOperation op,
CCAlgorithm alg,
CCOptions options,
const void *key,
size_t keyLength,
const void *iv,
const void *dataIn,
size_t dataInLength,
void *dataOut,
size_t dataOutAvailable,
size_t *dataOutMoved)API_AVAILABLE(macos(10.4), ios(2.0));