【问题标题】:bad practices in Apple’s sample code for the doCipher:key:context:padding methodApple 的 doCipher:key:context:padding 方法示例代码中的不良做法
【发布时间】:2013-05-13 17:36:00
【问题描述】:

根据这篇文章 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 的示例代码中有“不好的做法。以下代码 sn-p 表明它将使用 16 字节 0x0 的静态 IV。

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

uint8_t iv[kChosenCipherBlockSize];

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

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

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

【问题讨论】:

  • 你能快速总结一下博客对代码的看法吗?
  • 好吧,我根本不是专家,但我更新了:我只知道可以挂钩该代码以拦截对称密钥。但我不明白为什么以及如何防止这种情况发生。
  • 没关系。如果博客文章因某种原因消失,这只是为了让这个问题继续有用。谢谢!

标签: ios objective-c encryption


【解决方案1】:

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

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

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

【讨论】:

  • 这是“如何”,而不是“为什么”。 “为什么”是如果两条消息使用相同的密钥和初始化向量发送,密码分析者可以一起分析这两条加密消息以发现关于解密版本的信息。他能发现多少取决于密码的类型和使用的模式;详情请参阅this former Stack Overflow post
  • @BrentRoyal-Gordon “解密版本”通常被称为“纯文本”,但密钥应该保持安全。
  • 只是切断对memset() 的呼叫是非常糟糕的建议。这确实意味着 IV 可以包含不可预测的数据,但这并不意味着它包含加密意义上的随机数据。 “伪随机数据”(通常以某种方式播种)应替换为安全随机数据。魔鬼在细节中......
  • @owlstead 我知道仅仅依赖运行时特征是危险的(这就是我建议重写 memset() 的原因)。并且关于伪随机生成器的评论可以推广到种子算法,甚至可以推广到循环中对某种 ...rand-and-friends-esque 函数的几次调用。虽然我(偶尔)看到细微差别的必要性,但给他写一篇研究论文是没有用的!
  • 另一方面,简单地指向SecRandomCopyBytes 可能更有用,而将IV 前缀到密文可能是另一种方法。随机数不仅仅是正确执行加密的细微差别。
【解决方案2】:

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

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

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

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

【讨论】:

  • 感谢您对 dummy thing 的评论:我很高兴 Apple 的员工应该比第一眼更了解 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多