提高对称加密的安全性

编程

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

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

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

以上是 提高对称加密的安全性 的全部内容, 来源链接: utcz.com/z/514842.html

回到顶部