我正在修改现有的安全代码。规范很清楚,有示例代码,但我不是加密专家。实际上,示例代码中有一个免责声明,实际上是“不要逐字使用此代码。”
在审核我要修改的代码(据说功能已完成)时,我遇到了这个用于产生挑战的小宝石:
static uint16 randomSeed;
...
uint16 GetRandomValue(void)
{
return randomSeed++;/* This is not a good example of very random generation :o) */
}
当然,我立即做的第一件事就是将它传递到办公室,这样我们都可以大笑。
制作此代码的程序员知道它不是一个好的算法(如评论所示),但我不认为他们理解安全隐患。他们甚至懒得在主循环中调用它,所以它至少会变成一个自由运行的计数器 - 仍然不理想,但超出此范围的世界。
然而,我知道我生产的代码同样会导致一个真正的安全大师轻笑或震惊。
- 亚当
答案 0 :(得分:18)
不要尝试自己动手 - 尽可能使用标准库。对安全代码的细微更改可能会产生巨大的影响,不容易发现,但可能会打开安全漏洞。例如,two modified lines到一个图书馆打开了一个在很长一段时间内都不明显的漏洞。
答案 1 :(得分:12)
Applied Cryptography是一本很好的书,可以帮助您理解加密和代码。它涉及很多基础知识,比如分组密码如何工作,以及为什么选择差的密码模式会使你的代码无用,即使你使用的是完美实现的AES版本。
需要注意的一些事项:
答案 2 :(得分:6)
你的问题显示了一个比较常见的问题:不良的随机性来源。如果你使用256位密钥,如果它们的位不够随机,那么无关紧要。
2号可能假设您可以设计出比专家更好的系统。在这个领域,标准的质量实施几乎肯定会比创新更好。请记住,在SSL真正安全之前,它需要3个主要版本。我们认为。
答案 3 :(得分:4)
社会工程攻击。你应该培训你的用户不要做愚蠢的事情并编写你的软件,这样用户很难做出愚蠢的事情。我不知道对这些东西有任何好的参考。
不执行任意代码(缓冲区溢出,xss漏洞利用,sql注入都在这里分组)。要了解这一点,最简单的方法是阅读MS的某人编写安全代码并观看如何破解网络软件谷歌技术谈话。这也应该教你一些关于防御的深度。
逻辑攻击。如果您的代码正在处理纯文本,证书,签名,密文,公钥或任何其他加密对象,您应该意识到以不良方式处理它们会导致错误的事情。您应该注意的最小的事情包括离线和在线字典攻击,重放攻击,中间人攻击。了解这一点以及通常非常好的参考资料的起点是http://www.soe.ucsc.edu/~abadi/Papers/gep-ieee.ps
加密攻击。加密漏洞包括:
一般来说,一个很好的参考应该是应用密码学。
此外,我非常担心移动设备上可能已锁定且难以更新的内容是由询问stackoverflow安全性的人编写的。我相信您的案例是少数需要外部(好)顾问帮助您了解详细信息的案例之一。即使您聘请了我建议您做的安全顾问,也请阅读上述(简约)参考文献。
答案 4 :(得分:2)
我需要了解哪些最常见的加密安全问题?
简单 - 你(1)不够聪明,不能提出自己的算法。
答案 5 :(得分:1)
我也不是一个加密的人,但是S-box在搞乱时会很麻烦(而且确实有所不同)。你还需要一个真正的熵源,而不仅仅是一个PRNG(无论它看起来多么随机)。 PRNG没用。接下来,您应该确保熵源不是确定性的并且不能被篡改。
我的谦虚建议是:坚持使用已知的加密算法,除非您是专家并了解风险。您最好使用一些经过测试的公开可用的开源/公共域代码。