4

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

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

static uint16 randomSeed;

...

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

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

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

但是,我知道我生成的代码同样会导致真正的安全专家发笑或发抖。

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

-亚当

4

6 回答 6

18

不要尝试自己动手——尽可能使用标准库。对安全代码的细微更改可能会产生不易发现的巨大影响,但可能会打开安全漏洞。例如,对一个库的两条修改行打开了一个在很长一段时间内并不明显的漏洞。

于 2009-01-30T20:51:48.543 回答
12

应用密码学是一本很好的书,可以帮助你理解密码和代码。它涵盖了许多基础知识,例如分组密码的工作原理,以及为什么即使您使用的是完美实现的 AES 版本,选择较差的密码模式也会使您的代码毫无用处。

需要注意的一些事项:

  • 随机性的不良来源
  • 试图设计自己的算法或协议——永远不要这样做。
  • 没有得到它的代码审查。最好通过在线发布。
  • 不使用完善的库并尝试自己编写。
  • 加密作为万能药 - 加密数据不会神奇地使其安全
  • 密钥管理。如今,通过侧信道攻击窃取密钥通常比攻击加密货币更容易。
于 2009-01-30T20:55:48.503 回答
6

您的问题显示了一个更常见的问题:随机性来源不佳。如果它们的位不够随机,则使用 256 位密钥也没关系。

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

于 2009-01-30T20:51:37.887 回答
4

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

  1. 社会工程学攻击。您应该训练您的用户不要做愚蠢的事情,并编写您的软件,使用户很难做愚蠢的事情。我不知道有什么好的参考资料。

  2. 不要执行任意代码(缓冲区溢出、xss 漏洞利用、sql 注入都在这里分组)。为了了解这一点,要做的最少的事情是阅读 MS 某人的“编写安全代码”并观看“如何破解 Web 软件”谷歌技术讲座。这也应该教会你一些关于深度防御的知识。

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

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

    • 您可以避免的事情:错误的随机数生成、使用损坏的散列函数、安全原语的损坏实现(例如,工程师在代码中的某处忘记了 -1,这使得加密函数可逆)
    • 除非尽可能保持最新,否则您无法避免的事情:针对散列函数或加密函数的新攻击(参见最近的 MD5 谈话),新的攻击技术(参见最近对通过网络发送加密语音的协议的攻击)网络)

一般来说,一个很好的参考应该是应用密码学。

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

于 2009-01-30T21:37:43.707 回答
2

我需要了解的最常见的密码学安全问题是什么?

容易 - 你(1)不够聪明,无法提出自己的算法。

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

于 2009-01-30T20:54:52.140 回答
1

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

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

于 2009-01-30T20:57:00.450 回答