CWE-780:RSA算法未使用最优非对称加密填充漏洞
不夸张地说,只要有计算机网络的地方就有RSA算法,非对称加密算法的特点是加密秘钥和解密秘钥不同,秘钥分为公钥和私钥,用私钥加密的明文,只能用公钥解密,用公钥加密的明文,只能用私钥解密。
RSA非对称加密可以用来数据加密及数字签名和身份认证。非对称加密算法的优点是安全性高,并且算法强度复杂,安全性依赖于算法与密钥,但也由于算法复杂使得加密解密速度不如对称加密解密快。在RSA算法中如果未使用最优非对称加密填充将会产生漏洞。
什么是RSA算法未使用最优非对称加密填充?
软件使用了RSA算法,但并未使用最佳的非对称加密填充方式(OAEP),而如果不使用OAEP,那么就会使得网络攻击相对容易,攻击者只需较少的工作即可解密数据或从密文中推断出特征、模式。
什么是填充方式?
填充模式在代码中体现为padding,通常与加密算法一起使用,以使纯文本难以预测,使攻击工作变得更加复杂。
RSA加密填充的特点是什么?
RSA加密常用的padding有三种,最优非对称填充(OAEP)对应下述RSA_PKCS1_OAEP_PADDING填充方式:
RSA_PKCS1_PADDING
RSA_PKCS1_OAEP_PADDING
RSA_NO_PADDIN
与对称加密算法DES,AES一样,RSA算法也是一种块加密算法( block cipher algorithm),总是在一个固定长度的块上进行操作。但跟AES等不同的是,block length是跟key length有关的。
每次RSA加密的明文长度是受RSA填充模式限制的,RSA每次加密的块长度就是key length。
不同模式下的区别:
不同的padding模式下,使用相同长度的密钥可以加密的数据最大长度不同;
不同密钥长度下,使用相同的padding模式可以加密的数据最大长度也不同;
RSA常用的密钥长度有1024bits、2048bits,理论上1024bits的密钥可以加密的数据最大长度为1024bits(即1024/8 = 128bytes)。2048bits的密钥可以加密的数据最大长度为2048bits(2048/8 = 256bytes)。实际应用中RSA经常与填充技术(padding)一起使用,可以增加RSA的安全性。
为什么要使用最佳非对称加密填充(OAEP)?
填充技术关系到RSA安全性的高低,原因大致如下:
在弱安全填充模式下,RSA加密是确定的,即给定一个密钥,特定明文总会映射到特定的密文。攻击者可以根据密文中统计信息获取明文的一些信息。
填充技术如果比较弱,那么较小的明文和小型公开指数将易于受到攻击。
RSA有个特性叫做延展性,如果攻击者可以将一种密文转换为另一种密文,而这种新密文会导致对明文的转换变得可知,这种特性并没有解密明文,而是以一种可预测的方式操纵了明文,比如:银行交易系统中,攻击者根据新密文,直接去修改原密文中金额的数据,可以在用户和接受方无法感知的情况下进行修改。
该缺陷漏洞的防范和修补方法有哪些?
在代码中使用OAEP创建RSA密码:
rsa= javax.crypto.Cipher.getInstance("RSA/ECB/OAEPWithMD5AndMGF1Padding");
含有“RSA算法未使用最优非对称加密填充”安全漏洞的代码样例:
使用Wukong(悟空)软件代码安全漏洞检测修复系统检测上述程序代码,则可以发现代码中使用了弱安全加密填充方式,导致存在安全隐患。如下图:
“RSA算法未使用最优非对称加密填充”在CWE中被编号为CWE-780: Use of RSA Algorithmwithout OAEP。