根据这篇文章 http://blog.gdssecurity.com/labs/2013/3/5/retrieving-crypto-keys-via-ios-runtime-hooking.html
Apple的示例代码中存在“doCipher的错误做法:key:context:padding method 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));
为什么外行人的任期非常糟糕以及如何解决?
我唯一理解的是,可以挂钩该代码来拦截对称密钥。但我不明白为什么以及如何防止这种情况。
答案 0 :(得分:4)
该帖子中列出的代码是不安全的,因为它不遵循关于初始化向量是随机值的规则。请注意,编写它的工程师评论说:
//... dummy in this case 0’s.
固定大小的真正初始化向量(或者博客称之为IV)永远不会分配一个缓冲区来反复传递给具有相同值的加密函数,它们会改为每次随机化缓冲区包含的数据,以便通过查看提供的示例代码无法推断其位置 - 正如作者所做的那样。只需切断对memset()
的调用,运行时就会用“垃圾”填充该内存块。如果您想获得技术,请编写自己的memset()
版本,生成伪随机数据以覆盖该本地的内存。
答案 1 :(得分:3)
在Classes_SecKeyWrapper.m中,我们看到初始化向量(IV)用于调用CCCryptorCreate,它默认使用密码块链接(CBC)模式(如CommonCryptor.h中所述)。
CBC模式在加密前对每个块进行异或,并确保两个相同的块不会产生相同的结果。因为第一个块没有要与之进行异或的块,所以需要组成一个名为“初始化向量”的块。这会使第一个块的输出随机化,并降低replay attack或chosen-ciphertext attack的可能性。
在CBC模式下,每次调用CCCryptorCreate时,初始化向量应该是随机的且唯一的,并且应该由加密器和解密器代码使用(因此您必须将消息沿着消息发送给想要解密结果的人) 。
Apple示例代码注释了dummy in this case 0's
。假人是真实的替代品,所以我相信原作者知道这个问题,并且只是故意选择写一个简单的例子。