加密代码的陷阱

时间:2009-01-30 20:36:48

标签: security cryptography prng

我正在修改现有的安全代码。规范很清楚,有示例代码,但我不是加密专家。实际上,示例代码中有一个免责声明,实际上是“不要逐字使用此代码。”

在审核我要修改的代码(据说功能已完成)时,我遇到了这个用于产生挑战的小宝石:

static uint16 randomSeed;

...

uint16 GetRandomValue(void)
{
  return randomSeed++;/* This is not a good example of very random generation :o) */
}

当然,我立即做的第一件事就是将它传递到办公室,这样我们都可以大笑。

制作此代码的程序员知道它不是一个好的算法(如评论所示),但我不认为他们理解安全隐患。他们甚至懒得在主循环中调用它,所以它至少会变成一个自由运行的计数器 - 仍然不理想,但超出此范围的世界。

然而,我知道我生产的代码同样会导致一个真正的安全大师轻笑或震惊。

  • 我需要了解哪些最常见的加密安全问题?
  • 除了常见的错误之外,有什么好的资源可以让我了解我应该知道什么?

- 亚当

6 个答案:

答案 0 :(得分:18)

不要尝试自己动手 - 尽可能使用标准库。对安全代码的细微更改可能会产生巨大的影响,不容易发现,但可能会打开安全漏洞。例如,two modified lines到一个图书馆打开了一个在很长一段时间内都不明显的漏洞。

答案 1 :(得分:12)

Applied Cryptography是一本很好的书,可以帮助您理解加密和代码。它涉及很多基础知识,比如分组密码如何工作,以及为什么选择差的密码模式会使你的代码无用,即使你使用的是完美实现的AES版本。

需要注意的一些事项:

  • Poor Sources of Randomness
  • 尝试设计自己的算法或协议 - 不要这样做。
  • 未检查代码。最好通过在线发布。
  • 没有使用完善的库并尝试自己编写。
  • 加密作为万能药 - 加密数据并不神奇地使其安全
  • 密钥管理。如今,通过侧通道攻击窃取密钥往往比攻击密码更容易。

答案 2 :(得分:6)

你的问题显示了一个比较常见的问题:不良的随机性来源。如果你使用256位密钥,如果它们的位不够随机,那么无关紧要。

2号可能假设您可以设计出比专家更好的系统。在这个领域,标准的质量实施几乎肯定会比创新更好。请记住,在SSL真正安全之前,它需要3个主要版本。我们认为。

答案 3 :(得分:4)

恕我直言,您应该注意四种级别的攻击:

  1. 社会工程攻击。你应该培训你的用户不要做愚蠢的事情并编写你的软件,这样用户很难做出愚蠢的事情。我不知道对这些东西有任何好的参考。

  2. 不执行任意代码(缓冲区溢出,xss漏洞利用,sql注入都在这里分组)。要了解这一点,最简单的方法是阅读MS的某人编写安全代码并观看如何破解网络软件谷歌技术谈话。这也应该教你一些关于防御的深度。

  3. 逻辑攻击。如果您的代码正在处理纯文本,证书,签名,密文,公钥或任何其他加密对象,您应该意识到以不良方式处理它们会导致错误的事情。您应该注意的最小的事情包括离线和在线字典攻击,重放攻击,中间人攻击。了解这一点以及通常非常好的参考资料的起点是http://www.soe.ucsc.edu/~abadi/Papers/gep-ieee.ps

  4. 加密攻击。加密漏洞包括:

    • 你可以避免的东西:生成错误的随机数,使用破坏的哈希函数,破坏安全原语的实现(例如工程师在代码中忘记了-1,这使得加密函数可逆)
    • 除了尽可能保持最新之外你无法避免的东西:针对哈希函数或加密函数的新攻击(参见例如最近的MD5谈话),新的攻击技术(参见例如最近针对发送加密的协议的攻击)网络上的声音)
  5. 一般来说,一个很好的参考应该是应用密码学。

    此外,我非常担心移动设备上可能已锁定且难以更新的内容是由询问stackoverflow安全性的人编写的。我相信您的案例是少数需要外部(好)顾问帮助您了解详细信息的案例之一。即使您聘请了我建议您做的安全顾问,也请阅读上述(简约)参考文献。

答案 4 :(得分:2)

  

我需要了解哪些最常见的加密安全问题?

简单 - 你(1)不够聪明,不能提出自己的算法。

(1)而你,我的意思是你,我和其他所有人都在阅读这个网站......除了可能Alan KayJon Skeet

答案 5 :(得分:1)

我也不是一个加密的人,但是S-box在搞乱时会很麻烦(而且确实有所不同)。你还需要一个真正的熵源,而不仅仅是一个PRNG(无论它看起来多么随机)。 PRNG没用。接下来,您应该确保熵源不是确定性的并且不能被篡改。

我的谦虚建议是:坚持使用已知的加密算法,除非您是专家并了解风险。您最好使用一些经过测试的公开可用的开源/公共域代码。