一、秘钥池维护
每台应用服务器启动时生成一对秘钥对,并将秘钥对初始化到秘钥池,目前秘钥池里的秘钥数量等于应用服务器的台数,理论上秘钥对越多破解难度就越大。
当秘钥池不存在秘钥是重新生成秘钥对入池,防止意外清空秘钥池的情况
二、公钥复原
客户端在对数据进行加密前需要先对服务器端传递过来公钥串进行还原,基于以下两种方式可以在java、js、php等任何开发语言之间还原公钥:
A、根据公钥模数module和公钥指数exponent进行还原
B、将公钥字节转换成base64串,客户端解密这个base64串还原成公钥
这里采用B方案来还原公钥,好处在于只需要传递一个参数,客户端还原公钥也更简便
三、 RSA填充模式
RSA作为块加密算法,需要对块不足长的数据进行填充,填充算法主要有:
A、RSA_PKCS1_PADDING
最常用的模式
要求:
输入必须 比 RSA 钥模长(modulus) 短至少11个字节, 也就是RSA_size(rsa) – 11
如果输入的明文过长,必须切割,然后填充
输出和modulus一样长
根据这个要求,对于512bit的密钥, block length = 512/8 – 11 = 53 字节
B、RSA_PKCS1_OAEP_PADDING
RSA_size(rsa) – 41
C、RSA_NO_PADDING
不填充
加密解密两端需要用相同的填充模式,不然加解密数据会不一致