提高对称加密的安全性

原创
2020/03/28 14:08
阅读数 206

    最近有空闲时间,翻腾了一下好多年前弄了好久的密码学,在这里和大家探讨一下提高对称加密安全性的一些思路。

    本文使用的是java加解密工具包:bouncycastle(版本1.64)本文都基于此包进行展开(推荐使用,包含了市面上常见的绝大多数算法,还包括了国密算法SM2,SM3,SM4,祖冲之算法等)。

    对称加密:用相同的密钥进行加密和解密,密文可逆。由于密文可逆,千万不可用于登陆密码加密存储

    对称加密没有非对称加密安全性好,但为什么还有很多地方使用呢,是因为对称加密速度快,特别是很长的信息加密,用对称加密速度快,而且性能要求低,还是有很多地方使用对称加密的,提升对称加密安全性就是本文探讨的内容。

    一个正常加解密的流程如下:

  1. 选择一种算法
  2. 生成密钥
  3. 生成偏移量IV(也叫盐,沙子等),非必需
  4. 选择工作方式
  5. 选择填充方式
  6. 根据算法,工作方式,填充方式,实例化密码类Cipher(“ 算法/工作方式/填充方式 ”)
  7. init配置加解密模式
  8. 输入内容,进行加解密
  9. 输出处理后的字节,进行转字符串操作(加密一般转Base64,解密直接转字符串)
  10. 结束

常用算法如下,但不限于此(字母顺序排列)

AES
AESKW
AESKWP
AESWRAP
AESWRAPPAD
ARC4
ARCFOUR
ARIA
ARIAKW
ARIAKWP
ARIARFC3211WRAP
ARIAWRAP
ARIAWRAPPAD
BLOWFISH
BROKENPBEWITHMD5ANDDES
BROKENPBEWITHSHA1ANDDES
CAMELLIA
CAMELLIARFC3211WRAP
CAMELLIAWRAP
CAST5
CAST6
CCM
CHACHA
CHACHA20
CHACHA7539
DES
DESEDE
DHIES
DSTU7624
ECIES
ELGAMAL
ElGamal
GCM
GOST
Grain128
Grainv1
HC128
HC256
IDEA
IES
NOEKEON
RC2
RC2WRAP
RC4
RC5
RC5-32
RC5-64
RC6
RIJNDAEL
RSA
SALSA20
SEED
SEEDKW
SEEDWRAP
SHACAL-2
SKIPJACK
SM2        国密,非对称,椭圆
SM4        国密,对称
Serpent
Shacal2
TDEA
TDEAWRAP
TEA
Threefish-1024
Threefish-256
Threefish-512
Tnepres
Twofish
VMPC
VMPC-KSA3
XSALSA20
XTEA
ZUC-128    祖冲之,128
ZUC-256    祖冲之,256

常用工作方式如下,但不限于此(字母顺序排列)

CBC
CCM
CFB
CTR
CTS
EAX
ECB
GCFB
GCM
GOFB
NONE
OCB
OFB
OpenPGPCFB
PGP
PGPCFB
SIC

注:其中,CFB模式(密文反馈模式)和OFB模式(输出反馈模式)可设置反馈长度,例如:CFB8,CFB64,OFB8,OFB64等。

常用填充方式如下,但不限于此(字母顺序排列)

CS3PADDING
CTSPADDING
ISO10126PADDING
ISO10126-2PADDING
ISO7816-4PADDING
ISO9797-1PADDING
NOPADDING
PKCS1PADDING
PKCS5PADDING
PKCS7PADDING
TBCPADDING
X9.23PADDING
ZEROBYTEPADDING

    不同的算法,支持的密钥长度也不尽相同,例如著名的AES算法(高级加密标准)加上授权文件也只能支持到256位密钥,而RC4可以到2048或更高的密钥。

    不同的算法,支持的工作方式和填充模式也不尽相同,例如上边提到的RC4,只能用ECB模式,只能用NOPADDING填充。

    偏移量IV:相当于在加密的时候多了一个密钥,成为双密钥加密。这由工作方式的不同来决定是否需要,例如ECB模式不需要,而CBC模式必须输入。增加IV可以提升对称加密的安全性,也是各安全机构推荐使用的。不同算法使用的IV长度也不相同。


    OK,在有了这些基础后,可以开始考虑在哪里进行增强,来提升安全性:

    可造成安全事故的有三方面人:开发人员,运维人员,黑客。这里探讨一下如何针对这三方进行安全防范。

  • 开发人员:由于代码就是开发人员写的,用什么加密,密钥在哪,怎么存的全都知道,所以开发人员不接触生产环境生产库是原则问题,是制度问题,必须隔离,如遇到问题查找生产环境库或日志,要有规范的流程,必要的数据脱敏等操作。
  • 运维人员:运维人员直接接触生产环境,所以一定不能看到各种开发文档,密码不能直接存库(至少不能全存,要有足够的逻辑关系支撑),用制度进行管理。当然了,遇到删库跑路的,只能祈祷自己备份够多够及时吧。
  • 黑客:攻破了层层防线,拿到了代码和库的人。数据库不存密钥,用数据逻辑关联密钥池(例如入库时间数字和,时间秒数等,从内存的密钥池中获取相应的密钥)。还要考虑代码的防反编译问题,增加扰码,重要代码用其他语言编写等等。密钥要足够长,建议1024位以上,使用带有IV的工作方式,防止少数有钱的黑客用一批服务器暴力破解。

     提升安全等级的思路就是充分利用程序,库,文件,多系统等关系组合,分摊一个或几个系统被破解的风险。

    可将 “算法/工作方式/填充方式”用代码随机组合出一批可用的(随机组合并不都一定能用,要进行正常加解密验证),加入算法池;随机生成key加入密钥池;随机生成IV加入沙池;用隐性的逻辑关系和数据进行关联(例如:时分秒数字,id某一位,用户某项信息等从池中获取信息),池信息可用更更安全的椭圆算法进行加密存储,在系统启动时进行加载,生产系统与开发系统不能一样,椭圆算法的公私钥分开存储(代码文件库多种组合)。

    能提升安全性的系统,如何复杂都不为过,这里只是一种方案,大家可以想各种方法,不要怕系统过于复杂。


最后多说个小技巧:

加密后的字节数组是要转字符串进行存储的,常用的是转Base64,这里也有可玩花样的地方。例如:

  • 不用Base64,用Base58,看着长的很像,但实际是解不出来的,或者用其他小众的编码模式。
  • 用Base64后,再用凯撒加密进行一下偏移。
  • 用Base64后,程序从某几位截取,进行字符串重排。

等等,可以开动脑筋创造不同的花样。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部