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%的意义,那么您绝对不应该接近密码学。