CWE-329: 密码分组链接模式未使用随机初始化矢量
什么是密码分组链接模式未使用随机初始化矢量?
在密码块链接(CBC)模式下不使用随机初始化向量(IV)会导致算法容易受到字典攻击。
什么是CBC模式?
CBC模式的全称是Cipher Block Chaining模式(密文分组链接模式),之所以叫这个名字,是因为密文分组像链条一样相互连接在一起。在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。
初始化向量当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为IV,一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
什么是字典攻击?
字典攻击发生一般都是在黑客试图获得一个安全的网站的密码或地区通过使用每一个词在字典里(手动,这样他们就可以猜出密码)为了访问机密信息。对于分析和计算机安全、字典攻击是一种方法来克服代码或确认机制,试图解决其解密解决方案或密码。黑客行为这种攻击有时数以亿计的概率事件,比如用从字典里找出的单词来破解密码。
密码分组链接模式未使用随机初始化矢量漏洞的构成条件有哪些?
密码分组链接模式使用的初始化向量不是一个随机数。
密码分组链接模式未使用随机初始化矢量漏洞会造成哪些后果?
攻击者有机会通过字典式攻击读取加密的数据。
密码分组链接模式未使用随机初始化矢量漏洞的防范和修补方法有哪些?
密码分组链接模式使用随机的初始化向量。
含有“密码分组链接模式未使用随机初始化矢量”安全漏洞的代码样例:
byte[] iv = { //设置初始化向量为固定的值0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
KeyGenerator kg = null;
try {kg = KeyGenerator.getInstance("AES");}
catch (NoSuchAlgorithmException e)
{e.printStackTrace();}
SecretKey key = kg.generateKey();
Cipher cipher = null;
try {cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");}
catch (NoSuchAlgorithmException e) {e.printStackTrace();}
catch (NoSuchPaddingException e) {e.printStackTrace();}
IvParameterSpec ips = new IvParameterSpec(iv); //使用固定的初始化向量
try {cipher.init(Cipher.ENCRYPT_MODE, key, ips);}
catch (InvalidKeyException e) {e.printStackTrace();}
catch (InvalidAlgorithmParameterException e) {e.printStackTrace();}
使用Wukong软件静态分析工具检测上述程序代码,则可以发现代码中存在着密码分组链接模式未使用随机初始化矢量的安全漏洞。请见下图:
在这个示例中,初始化向量(IV)始终是零的块。这使得生成的密文更容易预测,并且容易受到字典攻击。
密码分组链接模式未使用随机初始化矢量在CWE中被编号为CWE-329: Not Using an Unpredictable IV with CBC Mode