Web程序员应该对密码学有什么了解?[关闭]


27

构建网站/ Web应用程序的程序员是否应该理解密码学?我不知道大多数冷冻算法如何工作,我真的不了解md5 / des / aes / etc之间的区别。你们是否有需要深入了解密码学的需要?

我不需要它,但我想知道是否可能丢失了某些东西。我已经使用salt + md5哈希来加密密码,并且我告诉Web服务器使用SSL。除此之外,我不能说我用别的不多,我也可以有把握地说,怎么这些方法都是安全的。我之所以只使用它们是因为其他人声称它们是安全的。

除了这两个简单的示例,您是否曾经发现需要在Web编程中使用加密技术?


4
他们应该足够了解,知道他们不应该这样做。
SLaks 2011年

@SLaks:+1 100%同意。我为此线程写了一个答案,以扩展其原因。
克里斯·杰斯特·杨

Answers:


41

Web程序员应该知道,他们永远不要尝试自己实现加密。

特别是,这意味着任何非安全专家都不应直接接触任何加密原语。他们不应该在AES,SHA-1等级别上进行思考。相反,他们应该使用高级功能来加密和签名消息以及“哈希”密码。

为什么?因为否则,人们就会误以为:

  • 尽管AES-256是在ECB模式下使用它,或使用非随机IV值等,但它是“高级加密”。(在某些模式下,可以使用非随机但唯一的IV。非常。)
  • 他们可以使用相同的对称密钥来加密多个消息(或更糟糕的是,将对称密钥存储在代码中以供直接使用)。
    • 他们甚至可以决定直接使用密码短语作为密钥,而不使用任何密钥派生功能。
  • 他们可以使用RSA直接加密数据。
  • 他们可以简单地“盐和MD5”他们的密码,以确保他们的安全。(如果您认为彩虹表是最薄弱的环节,请三思。)

只是在同一页上,以上所有项目都不行。如果您不明白这一点,那么您就不应该用10英尺的杆触碰加密货币!(AES-256 是一种很好的加密方法,但前提您正确使用它。“大小不重要,要用它来做。” :-)

我在说什么样的高级功能?我个人建议使用OpenPGP(用于静态数据)或SSL(用于动态数据)库。这些协议严格规定了不对称,对称和哈希算法的正确使用。例如,使用OpenPGP:

  • 它不使用RSA直接加密数据,而是为每条消息生成一个随机的会话(对称)密钥(这很重要),并使用RSA加密该会话密钥。
  • 它使用密钥派生功能将密码短语转换为密钥。(按照OpenPGP的说法,它称为S2K,但我认为“密钥派生功能”是更标准的术语。)
  • 它可以处理良好的模式,因此您永远都不会使用ECB。
  • 它为您处理密钥管理,因此您不必临时决定哪些密钥值得信任等。

简介:如果您不是安全专家,并且正在考虑使用AES或SHA-1或(禁止天堂)MD5级别,那么您做错了。使用由安全专家(如Bouncy Castle)编写的库来实现由安全专家(如OpenPGP进行加密,或使用bcrypt或scrypt进行密码哈希处理)设计的协议,而不用自己动手。

无论如何,我都不是加密专家,但是我知道不尝试设计自己的即席协议。为了清楚起见,整个帖子都是密码学101的材料。因此,如果这篇文章对您没有100%的意义,那么您绝对不应该接近密码学。


4
太棒了 喜欢链接到“再想一想”的博客文章。 chargen.matasano.com/chargen/2007/9/7/...
davidhaskins

+1,但多次使用相同的对称密钥也可以。这就是IV的用途(否则您将不需要它)。
orip

1
另外,以scrypt(和其他)闻名的Colin Percival有一篇很棒的文章叫做“ Cryptographic Right Answers”,其中列出了您需要做出的基本的加密决策。SSL非常有问题(很难撤销密钥)。这里更多的信息:daemonology.net/blog/...
OriP的

@orip同意,尽管我要说的是,在消息长度大于所选对称密码块大小的情况下,使用同一密钥和不同的IV通常会更有用,而不是在没有消息的情况下使用不同的消息跟踪用于先前消息的IV的上下文。同样,请同意Colin Percival的文章。
克里斯·杰斯特·杨

1
@Ajoy,我已将链接更改为更相关的内容。
克里斯·杰斯特·杨

14

您只需要了解密码学的基础知识(什么是哈希,什么是盐,大致破解这种加密的难易程度等等)就可以了,但是您必须了解一些安全方面的知识。一般。

作为Web开发人员,您绝对必须了解的主要安全领域:

  1. SQL注入。这可能是Web开发人员可以在系统上打的唯一最危险的漏洞。
  2. 跨站点脚本和cookie。
  3. 水龙头和验证码。
  4. SQL注入。不能足够强调它的重要性。

不了解自己的工作非常危险。不知道消息摘要哈希和加密哈希之间的区别会毁了您。不知道怎么加盐会毁了你。
隐身

@ user1525这就是我作为密码学基础知识的意思。您绝对不需要知道任何加密算法实际上如何工作。
biziclop 2011年

我很感激我的回答,并且同意SQL注入和其他攻击,但是我确实在问密码。
davidhaskins 2011年

2
@davidhaskins是的,我只是认为值得指出,因为每个级别都基于前一个级别。如果您无法在更基本的级别上保护应用程序,那么知道AES的工作原理将一文不值。以我的经验,这是许多开发人员陷入的陷阱(我曾做过几次),以专注于加密并忽略了它在安全性长链中的作用。
biziclop 2011年

4

我记得我曾见过一个名为“每个工程师都需要了解安全性和在哪里学习”的演讲,演讲者是尼尔·达斯瓦尼(Neil Daswani),这是他发表的Google技术演讲,可能是一个不错的起点!

但是,这不仅仅适用于Web程序员,也许应该将问题改名为“程序员应该对安全性了解什么?”。因为他们不需要了解更多有关密码学的基础知识(虽然很有趣)


2

加密在许多情况下都派上用场。我们使用的一个示例是加密由Win / IIS主机创建和设置的会话cookie,以在LAMP主机上使用。

如果要实现加密(与md5 / sha1散列相对),则一些基本术语很重要-例如对称和非对称加密之间的区别。除了了解两者之间的区别外,您还应该了解Web开发人员正确存储和保护解密密钥所需执行的操作。例如,如果要开发要部署在您没有完全管理控制权的主机(例如共享主机)上的应用程序,而不是部署在所有管理员都是已知且受信任的服务器上,则要进行部署。


2

我认为,您应该了解攻击您的代码的所有加密技术。您应该了解哈希,盐,随机的非随机性,主要的加密算法(RSA,3DES,AES等),SHA-1 / MD-5 / et al。您不必记住它们,但至少应该知道哈希算法的有效性以及如何使其更强大。您应该知道什么是碰撞和误报。您应该不能背诵加密算法,但是您应该熟悉它们的基准,哪种基准最适合哪种情况。您应该能够描述和解释对称与非对称加密以及何时使用它们。您应该知道什么是PKI以及如何使用它。您应该知道什么是证书颁发机构以及它如何与服务器交互。

了解一切的来龙去脉并不像了解其背景那么重要。某些事物的基准是什么(速度,强度,弱点等等)。

这些建议用于高级或架构师级别的信息。如果您只是一只划桨的网络猴子,则无需了解任何信息。您的架构师应该了解这些知识。如果您负责网站的设计,设计,实施等等,那么您应该熟悉所有这些概念并能够就这些概念进行明智的交流。您不必教书,只需接受和传播有关它的信息。



0

作为对这类问题的一个相当笼统的回答,我始终认为您应该对与您所做的工作密切相关的任何事情有一个基本的了解。当然,您需要有关实际工作的具体详细知识。很难预测某个区域将如何发展,什么将成为“时尚”或将来您将需要什么,因此拥有至少“听说”的广阔领域将保持许多门打开。

就我在Web编程方面的个人经验而言,我发现了不对称密码学的基本概念,这些东西有助于理解幕后情况。没有它,我本可以生存下来,但我必须说我喜欢密码学和数学,为什么不呢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.