加密安全

加密安全

Base64编码

二进制字节转化为文本格式

将任意二进制字节数据转化为只包含 AZ az 0~`9 + / =` 这64个字符

原理是将3个字节的二进制数据按照6bit一组, 用4个int整数表示, 然后将int整数用索引对应到字符, 得到编码后的字符串

3个byte数据分别是e4b8ad,按6bit分组得到390b222d

┌───────────────┬───────────────┬───────────────┐
│ e4 │ b8 │ ad │
└───────────────┴───────────────┴───────────────┘
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│1│1│1│0│0│1│0│0│1│0│1│1│1│0│0│0│1│0│1│0│1│1│0│1│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
┌───────────┬───────────┬───────────┬───────────┐
│ 39 │ 0b │ 22 │ 2d │
└───────────┴───────────┴───────────┴───────────┘

字符AZ对应索引025,字符az对应索引2651,字符09对应索引5261,最后两个索引6263分别用字符+/表示。

如果字节数不是3的倍数, 用 = 或者 == 补到三的倍数

例如 :

16个字节 补成 18个字节

最后会生成 24个字符(18 / 3 * 4)

哈希算法(Digest)

常用的哈希算法有:

算法 输出长度(位) 输出长度(字节)
MD5 128 bits 16 bytes
SHA-1 160 bits 20 bytes
RipeMD-160 160 bits 20 bytes
SHA-256 256 bits 32 bytes
SHA-512 512 bits 64 bytes

用哈希存储口令时要考虑彩虹表攻击, 通常通过加盐来加大破解难度(即便有彩虹表(数据量为m)和salt(数据量为n) 复杂度也会是O(m * n))

非安全专业不要尝试自己写哈希算法库, 直接用开源得到公众认可的库

消息认证算法(MAC)

Hmac算法就是一种基于密钥的消息认证码算法

Hmac算法总是和某种哈希算法配合起来用的, 本质上就是把key混入摘要的算法。验证此哈希时,除了原始的输入数据,还要提供key

这里的key可以理解为盐

可以配合MD5SHA-1等哈希算法,计算的摘要长度和原摘要算法长度相同。

对称加密算法

在软件开发中,常用的对称加密算法有:

算法 密钥长度 工作模式 填充模式
DES 56/64 ECB/CBC/PCBC/CTR/... NoPadding/PKCS5Padding/...
AES 128/192/256 ECB/CBC/PCBC/CTR/... NoPadding/PKCS5Padding/PKCS7Padding/...
IDEA 128 ECB PKCS5Padding/PKCS7Padding/...

【加密】DES加密算法中,ECB和CBC模式有什么区别?_ecb cbc-CSDN博客

对称加密算法决定了口令必须是固定长度,然后对明文进行分块加密。又因为安全需求,口令长度往往都是128位以上,即至少16个字符

DES算法由于密钥过短,可以在短时间内被暴力破解,所以现在已经不安全了。

ECB模式是最简单的AES加密模式,它只需要一个固定长度的密钥,固定的明文会生成固定的密文,这种一对一的加密方式会导致安全性降低

更好的方式是通过CBC模式,它需要一个随机数作为IV参数,这样对于同一份明文,每次生成的密文都不同

口令加密算法

PBE就是Password Based Encryption, 作用就是把用户输入的口令和一个安全随机的口令采用杂凑后计算出真正的密钥

PBE算法并没有真正构建新的加密/解密算法,而是对我们已经知道的对称加密算法(如DES算法)做了包装。使用PBE算法对数据做加密/解密操作的时候,其实是使用了DES或者是AES等其它对称加密算法做了相应的操作。

密钥交换算法