正文
如果你没有正确选择初始向量,那么安全性质就会遗失。在SSL/TLS中初始向量选择不当就是一个例子,
这个影响是巨大的
。
不幸的是,一些API也是有问题的。Apple API是一个初始向量可以被忽略的
典型的例子
——这告诉开发者初始向量是可选的,另外如果它没有提供初始向量,则使用全部是0的向量来替代。当然,这样的Apple API 仍然能加密和解密,但是它不再是安全的Apple API了!
在不同的工作模式中,关于初始向量和nonce的更多信息见
这里
。
3.电码本工作模式
当你使用分组密码加密,例如高级加密标准(AES),你应该选择一个分组密码的
工作模式
。你能选择的最糟糕的工作模式是
EBC模式
,EBC模式表示电码本工作模式。
在你不关心分组密码的底层的情况下使用EBC模式,因为它会泄漏明文的信息,所以它是不安全的。特别是,重复的明文将会产生重复的密文。如果你认为没什么关系的话,你有可能看不见
加密的企鹅
了。(图片的版权属于Larry Ewing, [email protected] ,提及一下GNU图像处理程序(
GIMP
)这款软件)。
不好的API将指定默认行为的工作交给了提供者,例如
Java在默认的情况下
使用的是EBC模式。令人遗憾的是,OWASP在他们的“Good Practice:Use Strong Algorithms”例子中
犯了这个错误
(使用了默认的EBC模式),但是他们在
这里
做对了(使用的是CBC模式),这是在互联网上少数几个没有问题的地方之一。
最重要的一点是不要使用ECB模式,安全使用模式的指南见
这里
。
4.密码存储过程中密码学原语的无用或滥用
当加密人员看见PBKDF2函数中迭代次数的值为1000的时候(对密码进行1000次的迭代),他们可能抱怨1000次的迭代次数太少,并且他们认为使用类似bcrypt这类函数是一个更好的选择。另一方面, 我只乐于开发人员做的事情是对的。
这里部分问题是出现
术语
的定义上,密码学界没有努力去解决这些问题。哈希函数是一个很棒的和很有魔力的函数。他们具有抗碰撞性、抗原像性、抗第二原像性的性质和他们有类似随机预言机的作用,并且不同的哈希函数在相同时间里的运行速度有快,也有慢。也许,与其过度依赖单一不错的函数,还不如现在定义出不同用途的不同加密函数啦。
在密码处理过程中,主要需要的性质有低速性、抗原像性和抗第二原像性。
Troy Hunt
完美的解释了为什么需要有低速的要求。
满足这些性质的函数有:pbkdf2、bcrypt、 scrypt 和argon2。
Thomas Pornin
在帮助开发者和安全工程师理解为什么在密码存储过程中建议使用bcrypt函数上发挥了出色的作用。另外,如果我们在处理密码中不需要关心MD5、SHA1、SHA256和SHA512的实现就好了。
另外,虽然PBKDF1函数已经被摒弃使用了,但是还有些API在使用PBKDF1函数,例如
Microsoft
和
Java
中的一些API。
此外,另外一个问题是在处理密码过程中硬编码盐值的问题。盐值的主要的用途之一是使两个完全相同的密码通过不同的盐值得到不同的哈希值。如果你硬编码盐值,就不会有上述性质了。既然这样,一个有权访问你数据库的人能透过对“哈希之后”的密码进行频率分析,然后轻而易举地识别一个易受攻击的目标。这使得攻击者的注意更加的集中在上述方法上,并且这也使得攻击者也更加容易获得成功。