security - 您何时可以信任自己实现基于密码的解决方案?

标签 security cryptography communication

如果我不是专家,我已经读过很多次shouldn't如何使用cryptography的信息。基本上,Jeff和Eric都告诉您相同的内容:

Cryptography is difficult, better buy the security solution from experts than doing it yourself.



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

我将在几个月后面临着为现有的解决方案提供安全解决方案的任务。也就是说,我们在服务器之间交换数据,该项目的第二阶段正在为其提供良好的安全性。购买第三方解决方案无论如何都会吃掉预算,因此...什么时候使用加密技术作为安全解决方案才好?即使您不是顶级专家。

编辑:由于某些注释而需要澄清。
该项目基于跨网络位置的数据传输,当前的实现方式允许在传输之前放置安全层,我们可以对自己喜欢的实现方式进行任何更改(假设合理的更改,架构设计合理,因此更改应具有可接受的范围)。影响)。问题围绕着埃里克·利珀特(Eric Lippert)的这句话:

I don’t know nearly enough about cryptography to safely design or implement a crypto-based security system.



我们不是在谈论重新发明轮子,当我设计使用C#.NET隐含安全 key 交换,加密和解密以及其他“反措施”(中间人等)的系统时,我想到的是某种模式。以及所包含的密码学原语,但我绝不是该领域的专家,因此当我读到该书时,我当然会开始怀疑。我什至有能力实现一个安全的系统? 除非我转包了那部分,否则它将始终是系统中不安全的部分吗?

最佳答案

我认为this blog posting(不是我的!)给出了一些很好的指导原则。

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

除此之外,尽管您要“发明”任何东西,但几乎可以肯定是错误的。在您链接到的《 Coding Horror》帖子中-我想到的主要错误是,他的水平很低,您不需要这样做。如果您正在用Java加密内容(我对.NET不太熟悉),则可以使用Jasypt,它使用了强大的默认算法和参数,并且不需要您了解ECB和CBC(尽管可以说,无论如何,您应该只是因为...)。

将会有一个预建的系统,可以处理您想要使用加密进行的几乎所有操作。如果要存储 key ,则为KeyCzar,在其他情况下为Jasypt。关键是,如果您对加密进行任何“不寻常”的操作,则不应该这样做。如果您做的事情不是“不寻常的”,那么您就不需要自己做加密了。不要发明一种新的方式来存储 key ,从密码生成 key ,验证签名等-没必要,它很复杂,并且除非您非常小心,否则几乎肯定会犯一个错误...

所以...我认为您不必不必担心加密事情,但要知道,如果直接在代码中为这些算法指定算法和参数,那可能就不好了。除了上面我链接的博客文章外,任何规则都有异常(exception)-如果您在代码中键入AES,说明您做错了!

Matasano博客文章中的关键“要点”就在结尾处(请注意,TLS是SSL的更精确名称):

THOMAS PTACEK

GPG for data at rest. TLS for data in motion.

NATE LAWSON

You can also use Guttman's cryptlib, which has a sane API. Or Google Keyczar. They both have really simple interfaces, and they try to make it hard to do the wrong thing. What we need are fewer libraries with higher level interfaces. But we also need more testing for those libraries.

关于security - 您何时可以信任自己实现基于密码的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1914257/

相关文章:

python - 使用pyusb与USB设备通信

.NET 处理主服务器和工作服务器之间的队列通信

java - WCF 服务 (JSON) 和 Android 客户端 - 消息安全

c# - 对于某些键名,RSACryptoServiceProvider(RSACryptoServiceProvider) 构造函数在 .NET 3.5 中崩溃

java - 带有盐和静态密码的 AES

docker - 容器间通信(TCP和UDP)显示网关IP为源IP

php - 如何防止 PHP 中的 SQL 注入(inject)?

iphone - 用于 iphone 访问的应用引擎 key

PHP:显示信息的最佳安全实践?

node.js - 在 Node.js 中生成和验证密码哈希值与 Python 的 werkzeug 相同