您何时可以信任自己实施基于加密的解决方案?

时间:2009-12-16 12:02:14

标签: security cryptography communication

如果我不是专家,我已经多次阅读shouldn't如何使用cryptography。杰夫和埃里克基本上都告诉你同样的事情:

  

密码学很难,更好地从专家那里购买安全解决方案而不是自己动手。

我完全同意,一开始就很难理解一个场景可能采取的所有可能路径,所有可能的攻击方式以及针对您的解决方案......但是那时我们应该何时使用它?

我将在几个月内面临为我们现有的解决方案提供安全解决方案的任务。也就是说,我们在服务器之间交换数据,项目的第二阶段为它提供了良好的安全性。购买第三方解决方案无论如何都会耗费预算......如何使用加密技术来获得安全解决方案?即使你不是TOP专家。

编辑:由于一些评论而澄清。 该项目基于跨网络位置的数据传输,当前实现允许在传输之前放置安全层,我们可以对我们喜欢的实现进行任何更改(假设合理的更改,架构设计良好,因此更改应该是可接受的影响)。问题围绕着Eric Lippert的这句话:

  

我对密码学的了解不足以安全地设计或实施基于加密的安全系统。

我们不是在谈论重新发明轮子,当我设计隐藏安全密钥交换,加密和解密以及其他一些“反措施”(中间人等)的系统时,我想到了某种模式。 C#.NET和包含的加密原语,但我不是该领域的专家,所以当我读到它时,我当然开始怀疑自己。我甚至能够实施一个安全的系统吗?除非我将该部分转包给它,否则系统的一部分是否会不安全?

9 个答案:

答案 0 :(得分:11)

我认为this blog posting(不是我的!)提供了一些很好的指导方针。

除此之外,除非您是专家,否则您应该从不做某些事情。这就像实现自己的加密算法(或您自己的已发布算法版本)。自己这样做真是太疯狂了! (当有CAPI,JCE,OpenSSL,....)

除此之外,如果你'发明'任何东西,那几乎肯定是错的。在你链接到的Coding Horror帖子中 - 我脑子里的主要错误是他做的很低,而你根本就不需要。如果你用Java加密东西(我不熟悉.NET)你可以使用Jasypt,它使用强大的默认算法和参数,并且不要求你知道ECB和CBC(尽管可以说,你应该只是因为...)。

对于你想要用加密做的任何事情,都会有一个预建系统。如果您要存储密钥,那么KeyCzar就是Jasypt,其他情况下是{{3}}。关键是如果你在加密中做任何“不寻常”的事情 - 你不应该这样做;如果你做的事情并不“不寻常”那么你就不需要自己做加密了。不要发明一种新的方法来存储密钥,从密码生成密钥,验证签名等 - 这没有必要,它很复杂,你几乎肯定会犯错误,除非你非常小心...

所以......我认为你不一定要害怕加密,但要注意,如果你直接在你的代码中为这些算法指定算法和参数,那么很可能不好。任何规则都有例外情况,但正如我在上面链接的博客文章中所述 - 如果您在代码中输入AES,那么您做错了!


Matasano博客文章中的关键“外卖”就在最后(请注意,TLS是一个更准确的SSL名称):

  

THOMAS PTACEK

     

GPG用于静态数据。数据的TLS   运动。

     

NATE LAWSON

     

你也可以使用Guttman的cryptlib,   它有一个理智的API。或谷歌   Keyczar。他们都非常简单   接口,他们试图做到这一点   很难做错事。我们是什么   需要的是更少的库   级别接口。但我们也需要   对这些库进行更多测试。

答案 1 :(得分:8)

如果您不是专家,那么加密的经验法则并不是您不应该使用;相反,除非你是专家,否则你不应该重新发明轮子。换句话说,尽可能使用现有的实现/库/算法。例如,不要编写自己的加密认证算法,或者提出另一种存储密钥的方法。

至于何时使用它:每当您需要保护数据时,不要让其他人看到它。除此之外,它归结为哪种算法/方法最佳:SSL与IPsec对比对称与PKI等。

此外,提出建议:密钥管理通常是任何综合加密解决方案中最具挑战性的部分。

答案 2 :(得分:3)

你有事情倒退:首先你必须详细说明你的实际要求(“提供安全解决方案”是毫无意义的营销活动)。 然后您正在寻找满足这些特定要求的方法; croptography将满足其中一些。

加密可满足的要求示例:

  • 保护通过公共频道发送的数据免受间谍活动
  • 保护数据免遭篡改(或者更确切地说,检测操纵数据)
  • 允许服务器和客户以及用户相互证明自己的身份

答案 3 :(得分:1)

支付安全性(加密是其中的一部分,但只是其中的一部分)它的价值是什么,但不多。因此,您的首要任务是确定您的安全性值,或者确定各种安全状态的价值。然后邀请任何持有预算的人选择要瞄准的州,以及花费多少。

这里没有绝对,这都是相对的。

答案 4 :(得分:1)

您需要完成与任何其他要求相同的过程。要解决的问题是什么,用户正在寻找的结果是什么,提出的解决方案将如何得到支持,涉及的时间表是什么。有时会有一个现成的解决方案来完成这项工作,有时您需要将其作为自定义解决方案进行开发,有时您会选择自定义解决方案,因为它比现成的解决方案更具成本效益。

安全要求也是如此,但增加的复杂性是,任何类型的自定义解决方案都需要技术团队的额外专业知识(开发,支持等)。还有一个问题是,解决方案可能不仅需要安全,而且被认为是安全的。使用现成的解决方案可能更容易实现这一点。

RickNZ绝对正确 - 不要忘记密钥管理。作为决策过程的一部分,在开始时考虑这一点。

答案 5 :(得分:1)

我首先要问的问题是,你想要实现的目标是什么。
如果您只是想确保将数据从服务器a传输到服务器b,那么您可以使用许多机制,这些机制几乎不需要工作,例如SSL。
但是,如果您试图保护应用程序中存储的所有数据要困难得多,尽管这是一项要求,那么我建议任何加密技术,无论多么容易破解,都比没有更好。< / p>

答案 6 :(得分:1)

作为被要求做类似事情的人,您在实施系统时面临着许多令人畏惧的问题。保护系统和实施加密系统之间存在重大差异。

在理论和实践中,实施加密系统非常困难,专家经常会弄错。一个着名的理论失败是背包密码系统,由于Lenstra-Lenstra-Lovász格子基础约简算法而被大量抛弃。另一方面,我们在去年看到Debian的随机数生成器中的错误种子如何打开操作系统生成的任何密钥。您希望使用预先打包的密码系统,不是因为它是“仅限专家”字段,而是因为您需要经过社区测试和支持的系统。几乎我所知道的每一个加密算法都有一定的界限,认为某些任务很难,如果这些任务变得可计算(如在LLL算法中),整个系统在夜间变得无用。

但是,我相信,问题的真正核心是如何使用东西来建立一个安全的系统。虽然有许多库可以生成密钥,加密文本等等,但实现整个软件包的系统却很少。但一如既往,安全归结为两个概念:保护价值和信任圈。

如果你正在守护希望钻石,你花了很多钱设计一个系统来保护它,雇用一支不断的力量来观察它,并雇用破解者不断试图闯入。如果你只是劝阻无聊的青少年阅读你的电子邮件,你在一小时内搞砸了什么,而你不会将该地址用于秘密公司文件。

另外,管理信任圈也是一项艰巨的任务。如果你的圈子包括技术娴熟,志同道合的朋友,那么你就建立了一个系统并给予他们对系统的大量信任。如果它包含许多级别的信任,例如用户,管理员等,则您拥有分层系统。由于您必须与更大的圈子管理越来越多的交互,因此较大系统中的错误会成为黑客攻击的弱点,因此您在设计此系统时必须非常小心。

现在回答你的问题。当您保护的项目足够有价值并且您的信任圈包括您不能信任的那些时,您就聘请了安全专家。你不设计加密系统,除非你以此为生,并有一个社区来打破它们,它是一个全职的学科。如果你想破解乐趣,请记住它只是为了好玩,不要让你保护的东西的价值太高。

答案 7 :(得分:0)

为什么购买加密?它是高质量开源软件中最发达的领域之一:)例如参见TrueCryptOpenSSL

很有可能无论你需要加密技术,已经有一个质量好,信誉良好的开源项目! (如果你能看到源代码,你可以看到他们做了什么;我曾经看过一篇关于商业软件应该“加密”一个文件的文章,该文件只是用固定的值对每个字节进行xorred!)

而且,为什么你想重新发明轮子?在没有加密背景的情况下,你不太可能做得更好,甚至接近当前的算法,如AES。

答案 8 :(得分:0)

我认为这完全取决于你想要达到的目标。

数据是否需要在任何一端加密存储,还是只需要在传输过程中加密?

您如何传输数据? FTP,HTTP等?

将安全性作为第二阶段可能不是一个好主意,因为那时你可能已经在一段时间内不安全地移动数据?

相关问题