如果我不是专家,我已经读了很多次我不应该使用加密技术.杰夫和埃里克基本上都告诉你同样的事情:
密码学很难,更好地从专家那里购买安全解决方案而不是自己动手.
我完全同意,一开始就很难理解一个场景可能采取的所有可能路径,所有可能的攻击方式以及针对您的解决方案......但是那时我们应该何时使用它?
我将在几个月内面临为我们现有的解决方案提供安全解决方案的任务.也就是说,我们在服务器之间交换数据,项目的第二阶段为它提供了良好的安全性.购买第三方解决方案无论如何都会耗费预算......如何使用加密技术来获得安全解决方案?即使你不是TOP专家.
编辑:由于一些评论澄清.该项目基于跨网络位置的数据传输,当前实现允许在传输之前放置安全层,我们可以对我们喜欢的实现进行任何更改(假设合理的更改,架构设计良好,因此更改应该是可接受的影响).问题围绕Eric Lippert的这句话:
我对密码学的了解不足以安全地设计或实现基于加密的安全系统.
我们不是在谈论重新发明轮子,当我使用C#.NET设计隐藏安全密钥交换,加密和解密以及其他一些"对策"(中间人等)的系统时,我想到了某种模式.和包含的加密原语,但我不是该领域的专家,所以当我读到它时,我当然开始怀疑自己.我甚至能够实施安全系统吗?除非我将该部分转包,否则它总是会成为不安全系统的一部分?
我认为这篇博文(不是我的!)提供了一些很好的指导.
除此之外,有一些事情你应该永远不会做,除非你是一个专家.这就像实现自己的加密算法(或您自己的已发布算法版本).自己这样做真是太疯狂了!(当有CAPI,JCE,OpenSSL,....)
除此之外,如果你'发明'任何东西,那几乎肯定是错的.在你链接到的Coding Horror帖子中 - 我脑子里的主要错误是他做的很低,而你根本就不需要.如果你用Java加密东西(我不熟悉.NET)你可以使用Jasypt,它使用强大的默认算法和参数,并且不要求你知道ECB和CBC(尽管可以说,你应该只是因为...).
对于你想要用加密做的任何事情,都会有一个预建系统.如果你正在存储密钥,那么就是KeyCzar,在其他情况下还有Jasypt.关键是如果你在加密中做任何"不寻常"的事情 - 你不应该这样做; 如果你做的事情并不"不寻常"那么你就不需要自己做加密了.不要发明一种新的方法来存储密钥,从密码生成密钥,验证签名等 - 这没有必要,它很复杂,除非你非常小心,否则几乎肯定会犯错误......
所以......我认为你不一定要害怕加密事情,但要注意,如果你直接在你的代码中为这些算法指定算法和参数,那可能就不好了.任何规则都有例外,但在上面链接的博客文章中 - 如果您在代码中键入AES,那么您做错了!
来自Matasano博客文章的关键"外卖"就在最后(请注意,TLS是一个更精确的SSL名称):
THOMAS PTACEK
GPG用于静止数据.TLS用于运动中的数据.
NATE LAWSON
你也可以使用Guttman的cryptlib,它有一个理智的API.或Google Keyczar.它们都具有非常简单的界面,并且它们试图使得做错事情变得困难.我们需要的是具有更高级别接口的更少库.但我们还需要对这些库进行更多测试.
密码学的经验法则并不是如果你不是专家就不应该使用它; 相反,除非你是专家,否则你不应该重新发明轮子.换句话说,尽可能使用现有的实现/库/算法.例如,不要编写自己的加密验证算法,或者提出另一种存储密钥的方法.
至于何时使用它:每当你有数据需要保护,让其他人看到它.除此之外,它归结为哪种算法/方法最佳:SSL与IPsec对比对称与PKI等.
另外,提出建议:密钥管理通常是任何综合加密解决方案中最具挑战性的部分.