4

根据这篇文章 http://blog.gdssecurity.com/labs/2013/3/5/retrieving-crypto-keys-via-ios-runtime-hooking.html

在 Apple 的 doCipher:key:context:padding 方法http://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.html的示例代码中有“不好的做法。以下代码片段显示它将使用 16 字节 0x0 的静态 IV。

 // Initialization vector; dummy in this case 0’s.

uint8_t iv[kChosenCipherBlockSize];

memset((void *) iv, 0x0, (size_t) sizeof(iv));

为什么用外行的话来说真的很糟糕以及如何解决它?

我只了解可以挂钩该代码以拦截对称密钥。但我不明白为什么以及如何防止这种情况。

4

2 回答 2

4

该帖子中概述的代码是不安全的,因为它不遵循关于初始化向量是随机值的规则。请注意,编写它的工程师评论说:

//... dummy in this case 0’s.

固定大小的真正初始化向量(或 IV,正如博客所说的那样)永远不会分配一个缓冲区以一遍又一遍地传递给具有相同值的加密函数,而是每次都会随机化缓冲区包含的数据,所以无法通过查看提供的示例代码来推断其位置 - 正如作者所做的那样。只需切断对 的调用memset(),运行时就会用“垃圾”填充该内存块。如果您想获得技术,请编写您自己的版本memset(),生成伪随机数据以覆盖该本地的内存。

于 2013-05-18T21:43:50.063 回答
3

Classes_SecKeyWrapper.m中,我们看到初始化向量 (IV) 用于调用 CCCryptorCreate,它默认使用密码块链接 (CBC) 模式(如CommonCryptor.h中所述)。

CBC 模式在加密之前将每个块与下一个块进行异或,并确保两个相同的块不会产生相同的结果。因为第一个块没有要与之异或的前一个块,所以您需要组成一个称为“初始化向量”的块。这使第一个块的输出随机化并降低了重放攻击选择密文攻击的机会。

在 CBC 模式下,初始化向量对于每次调用 CCCryptorCreate 应该是随机且唯一的,并且应该由加密器和解密器代码使用(因此您必须将其与消息一起发送给想要解密结果的任何人)。

Apple 示例代码用 注释dummy in this case 0's。假人是实物的替代品,所以我相信原作者意识到了这个问题,只是故意选择写一个简化的例子。

于 2013-05-19T19:13:03.050 回答