网站安全公司对密码泄露问题分析并修复解决

AcFun数据库泄露的消息近日在清晨广为流传。幸运的是,从AcFun的声明中可以看出,泄露的用户密码已经被“加密”(实际上是散列),所以我们仍然是安全的。
 网站安全代码泄露密码问题尤为严重,从一些泄露的信息可以看出,AcFun在存储密码方面没有犯任何低级错误。此外,由于真诚的道歉,许多人说他们“选择原谅”合格的后端开发人员以及操作和维护人员需要考虑每个接口的安全性以及公共网络可访问的每个服务器的安全性,以确保不会出错。然而,当我们犯了错误时,我们仍然需要考虑如何使损失最小化。在制定数据存储方案时,我们需要假设存储的数据已经泄露出去。用户密码等私有数据的存储是一个关键点。
在谈到密码存储方案之前,有三个先决条件需要记住:
用户喜欢在任何地方使用相同的密码。
用户喜欢使用简单易记的密码
世界上没有绝对的安全性,但是当攻击成本远远高于收益时,整个系统就实现了相对安全性。
明文存储?
即使只是从道德的角度来看,后端也不应该以明文形式存储用户密码。在2011年CSDN密码泄露和2016年网易52G密码泄露之后,比数据库被盗更令人震惊的是,他们泄露的数据库中的所有密码都是明文。
明文存储方法将所有安全性委托给操作和维护人员、开发人员和管理人员:
从操作和维护的角度来看,任何操作系统漏洞和基本工具漏洞都会导致密码泄露
从开发级别来看,任何代码逻辑漏洞、任何依赖库漏洞都可能导致密码泄露
从管理级别来看,任何有权访问数据库的人都可以看到所有用户的密码。
由于前提1(每个人在任何地方都总是使用相同的密码),明文密码公开后,其他网站的用户密码可以通过库冲突攻击获得,从而对用户造成更严重的伤害。例如,在2014年的12306密码泄露事件中,12306没有犯任何错误,但黑客收集了许多其他网站的明文账户密码,然后试图批量登录到12306,以获取大量用户的12306信息。
因此,后端不应以任何明文或可转换回明文的形式存储密码(如可逆加密)。由于存储的信息不是明文,大多数网站的“检索密码”功能不会真正告诉您密码,但只允许您重置一次。如果你发现一个网站的“找回密码”功能真的找回了你的密码,你应该小心你的密码的安全性。
做个杂烩?
为了保存某种可验证的密码形式,并使保存的数据“不可逆”,散列是可以想到的第一件事。
十年前,大多数网站都保存着经过MD5哈希运算的密码。哈希保存的思想非常简单:当用户注册时,他的密码通过MD5操作存储;当用户登录时,他对输入的密码执行MD5操作,然后验证它是否与存储在数据库中的密码一致。
MD5被证明不安全后,每个人都开始选择其他哈希算法,如sha256。然而,除了哈希算法本身的安全性之外,该方法的缺陷很快暴露出来,即无法应对彩虹表的攻击。
Md5哈希
彩虹表是尽可能计算简单数字密码组合(和各种常见密码)的散列值。这些明文和散列结果之间的对应关系是一个张彩虹表。因为前提2(人们喜欢使用简单且易于记忆的密码),尝试计算一个在共同范围内所有字母组合散列的彩虹表,绝大多数人的密码都可以被破解。当彩虹表足够大时,这种存储方法实际上与纯文本相同。
服务器安全防护应该采取哪些措施?
下图显示了cmd5已破解的明文范围。
Md5数据
在这种存储方式下,一次计算出的彩虹表可以被使用无数次,而且每个用户分配到每个网站的成本极低,所以很多服务器仍然在孜孜不倦地研究md5哈希彩虹表。随着每个人的努力,这块彩虹手表越来越大。
盐杂烩?
盐杂凑目前是行业中最常见的做法。
盐哈希的步骤如下:
当用户注册时,他会随机生成一个字符串,即盐。
用户注册时输入的密码与salt拼接在一起,称为salt密码。
散列盐密码并存储结果和盐。
登录时,可以通过先取出盐,以同样的方式拼接和计算哈希来判断密码的合法性。
盐哈希方法不仅保证了存储数据的不可逆性,还防止了前一章中彩虹表攻击方法。这样,黑客获得数据库后,如果他想通过遍历所有常用的密码组合来创建彩虹表,那么他需要检查所有的密码组合公共密码+盐值
执行散列。然而,每个用户的盐值是不同的,在彩虹表从“一次操作和无数次使用”变成“一次操作和一次使用”之前。这种成本是不可接受的,因为前提3(攻击成本远远高于收入,系统相对安全),所以这是一种更安全的方法。
除了密码,还有其他信息
除了密码,手机号码和其他信息也是重要的私人数据。但手机号码不同于密码:对于后端来说,永远不知道密码的明文不会影响业务逻辑;然而,在某些情况下,后端可能需要一个清晰的电话号码来向用户发送短消息。
对于手机号码等信息,只能使用相对安全的方法,即首先对称加密手机号码,然后将加密结果存储在数据库中;用钥匙开锁。
此时不应将密钥存储在数据库中。如果数据库被拖动,那么数据的安全性与明文相同。密钥通常作为环境变量放在服务器上。此时,除非网站在被拖到图书馆的情况下同时获得服务器许可,否则手机号码的明文不会泄露出去。
不幸的是,从AcFun今天泄露的数据来看,站A也应该对手机号码进行对称加密存储,但是当它被拖到图书馆时,它也被赋予了服务器权限,所以手机号码以明文显示。
除了数据库,还有其他地方
就在上个月,2018年5月4日,twitter发布了一份通知,称他们永远不会存储密码的明文,但他们发现了一个漏洞:密码存储在请求日志中。
在后端项目生产环境中,总是打印和收集各种日志。日志可以促进统计、出错时的回溯和调试错误。但是,我们不应该总是打印和收集请求的所有正文内容,因为请求可能包含密码等敏感信息。当日志泄露时,用户数据也将以明文形式直接泄露。