设计安全的账号系统的正确姿势
副标题[/!--empirenews.page--]
引子 最近有个虚拟练习项目,涉及到系统安全保障的设计,于是对安全保障这块做了一些更深入的了解。发现了很多有趣的东西,开阔了眼界。中间查了一些资料,于是我打算重新整理,用更加循序渐进,大家都能懂的方式,说一说如何设计一个安全的系统。 著名的安全事件 首先来看看最近几年比较著名的拖库撞库后密码泄露的事件:
除了密码泄露事件,数据被物理删除的事件也是发生: 2015年5月,携程网及APP陷入瘫痪,数据库遭物理删除疑似离职员工报复。 这么多大公司大网站的系统都遭到攻击,泄露用户信息,更别说其他小网站了。这些攻击都可以从技术上来进行防范的,但是我们看到即使是大公司,安全方面也是那么的薄弱。 防范方法 防范的方法简单来说数据从用户键盘敲出的那一刻,到服务器后台存储都要保持正确的姿势。比如: 用正确的姿势保存密码。 用正确的姿势传输数据。 用正确的姿势加密敏感信息。 用正确的姿势对数据进行备份和监控。 用正确的姿势保存密码 这一步非常重要,也比较复杂。用户在浏览器里输入密码,传输到服务器端进行验证,服务端将之前保存的密码信息和用户的输入进行比对。 1. 低级错误:明文保存密码 安全性最低的是在服务端明文保存用户的密码,一旦服务器被入侵,数据被拖走(拖库),所有用户的密码都直接的暴露在外面。这是最初级的做法,毫无安全性可言。假如你在一个网站或论坛注册了一个账号,该网站自动发了一封邮件告诉你注册成功,里面明文写了你的密码,赶紧把密码改了然后再也不要访问这个网站。 2. 低级错误:可逆加密密码 既然不能明文保存密码,那当然是加密保存了。耍个小聪明,比如把密码的字母倒着存,或者每个字母存后一个字母,或者进行异或混淆处理,表面上密码看上去已经看不出来原始的密码是什么了,但实际上这个和明文保存密码并没有本质区别,因为黑客既然可以入侵你的服务器,自然可以拿到你的加密代码,只要按你的算法进行简单的解密就可以得到原始密码。 3. 错误方法:md5 加密密码 在我还是一个初学者的时候,我已被告知不能用前两种方式保存密码,当时的主流方法是使用 md5 加密密码。(年代久远,现在已绝非主流了。) md5 是一种不可逆的加密方法,即密码被 md5 加密后是无法解密出原始密码的,验证密码是否正确的方法是将用户输入的密码 md5 加密后于数据库里保存的 md5 机密后的结果进行比对。这样,服务器端在不知道真实用户密码的情况下也能对用户密码进行验证了。 这是早期比较主流的做法,然而,这依然是非常不安全的。因为只要枚举所有短密码进行 md5 加密,做成一个索引表,就能轻易的逆推出原始密码。这种预先计算好的用于逆推加密散列函数的表就是“彩虹表”。随着“彩虹表”不断变大,md5 的加密已经变得非常的不安全。2015年10月网易邮箱的用户密码泄露也被怀疑只对密码进行了 md5 加密。 4. 正确方法:加盐 hash 保存密码 加盐 hash 是指在加密密码时,不只是对密码进行 hash ,而是对密码进行调油加醋,放点盐(salt)再加密,一方面,由于你放的这点盐,让密码本身更长强度更高,彩虹表逆推的难度更大,也因你放的这点盐,让黑客进行撞库时运算量更大,破解的难度更高。 如何进行加盐就是一门很重要的学问了。md5 是一种 hash 算法,以下就拿 md5 来举例。假如密码是 123456 ,md5 的结果如下: 像 123456 这样的简单密码,是很容易被逆推出来的。但是假如我们往简单密码里加点盐试试: 上面例子里的 #g5Fv;0Dvk 就是我们加的盐。加完之后,密码的强度更高了,彩虹表破解的难度加大了。或者进行加盐两次 md5 : 到这里,你一定会有疑问,是不是把 md5 多做几次,或者自定义一些组合的方式就更安全了。其实不是的,黑客既然能拿到数据库里的数据,也很有可能拿到你的代码。 一个健壮的、牢不可破的系统应该是: 即使被拿走了数据和所有的代码,也没办法破解里面的数据。 这也是为什么大家不必实现自己的加密算法,而是使用公开的加密算法的原因,比如:RSA、AES、DES 等等。既然无法保证加密代码不被泄露,那就使用公开的加密算法,只要保护好私钥信息,就算你知道我的加密方式也没有任何帮助。 大部分情况下,使用 md5(md5(password) + salt) 方式加密基本上已经可以了: 其中,最关键的是 salt 从哪里来? salt 该怎么设置才能安全。有几个重要的点: 不要使用固定不变的 salt。 每个用户的 salt 都需要不同。 salt 必须由服务端使用安全的随机函数生成。 客户端运算需要的 salt 需要从服务端动态获取。 客户端加盐 hash 的结果并不是最终服务端存盘的结果。 由于客户端也需要执行加盐 hash ,所以,salt 不能直接写在客户端,而是应该动态从服务端获得。服务端生成随机的 salt 时,必须使用安全的随机函数,防止随机数被预测。 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |