作为软件开发者,其中最重要的一个责任就是保护用户的个人信息,如果用户没有相关技术知识,他们在使用我们服务的时候,别无选择只能信任我们。可惜的是,当我们调查关于密码处理的时候,我们发现有各种不同的处理方式,而这些方式有很多都不安全。虽然不可能构建一个完全安全的系统,但我们可以通过一些简单的步骤让我们的密码存储足够安全。
不应该:
首先让我们看看当我们构建一个需要用户认证的系统的时候不应该怎么做。
●在不得已的时候不要自己存储用户的认证信息。我们可以考虑使用OAuth的提供者例如Google、Facebook。如果构建企业内部的应用,可以考虑使用已有的内部认证服务,例如企业LDAP或者Kerberos服务。无论是面向公众的还是面向内部的应用程序,用户会喜欢这个应用,因为他不需要多记住一个ID和密码,同时也少了受黑客攻击的危险。
●如果你必须存储认证信息,不要存储明文密码。这句话就不解释了。
●不要使用可逆的加密方式,除非你在某种状况下真的需要查出来明文密码。因为在进行用户身份验证的时候并不需要明文密码去比对。
●不要使用过时的哈希算法,例如md5,在现在这个社会,有人可以通过构建一个超大的md5库来反向的查询出明文。换句话说md5哈希基本上没什么用,你要是不相信可以拿这个密文(569a70c2ccd0ac41c9d1637afe8cd932)去md5hacker上看看,几秒内就可以查出明文了。
应该:
说完了不应该做的,就说说应该做的:
●选择一个单向(不可逆)的加密算法。就像我上面说的一样,仅仅存储加密后的用户密码,用户每次认证就使用相同的算法加密后比对就可以了。
●选择一个你的应用可以承受的最慢的加密算法。任何现代的加密算法都支持在加密的时候接受参数从而使加密时间延长,而解密也自然就更难。(例如PBKDF2,可以通过制定迭代的次数来实现)。为什么慢了好呢?因为用户几乎不会关心他为了认证自己的账户额外的花销了100ms。但是黑客就不同了,当他进行上10亿次的尝试计算的时候,就有他喝一壶的了。
●选择一个流行的算法。美国国家标准与技术研究院推荐使用PBKDF2加密密码。