悟空云课堂丨代码安全第四十二期:密码分组链接模式未使用随机初始化矢量

137 阅读3分钟

中科天齐倾情打造《悟空云课堂》旨在科普软件安全相关知识,助力企业有效防范软件安全漏洞,提升网络安全防护能力。本期主题为密码分组链接模式未使用随机初始化矢量漏洞的相关介绍。

一、什么是密码分组链接模式未使用随机初始化矢量?

在密码块链接(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软件静态分析工具检测上述程序代码,则可以发现代码中存在着密码分组链接模式未使用随机初始化矢量的安全漏洞。请见下图:

5.jpg

在这个示例中,初始化向量(IV)始终是零的块。这使得生成的密文更容易预测,并且容易受到字典攻击。

6.png

密码分组链接模式未使用随机初始化矢量在CWE中被编号为CWE-329: Not Using an Unpredictable IV with CBC Mode

软件安全 网络安全的最后一道防线

中科天齐公司是在中科院计算技术研究所的大力推动下

以中科院计算所国际领先的自主研究成果

软件代码漏洞检测修复平台(Wukong悟空)

为基础组建的高新技术企业

2.jpg

关键词标签:悟空云课堂 密码分组链接 随机初始化矢量 代码安全检测 代码漏洞检测

原文链接:www.woocoom.com/b021.html?i…