这几天AcFun数据库泄露的消息一大早就沸沸扬扬地传开了,所幸从AcFun的公告里可以看出泄露的用户密码均经过「加密」(实际上指哈希),所以我们仍然是安全的。

网站安全代码

从泄露出的部分信息可以看到,在存储密码这件事上,AcFun并没有犯什么低级错误,加之道歉诚恳,很多人表示「选择原谅」。

合格的后端开发者和运维人员需要考虑每个接口的安全性、每个可被公网访问到的服务器的安全性,保证不要犯错。但是我们还需要考虑,如何在已经犯错的情况下把损失降低到最小。在做数据的存储方案时,我们需要假设储存的数据已经被泄露出去了,如用户密码这种隐私数据的存储就是一个重点。

讲密码的存储方案前,先要记住三条前提:

用户喜欢到处使用一样的密码

用户喜欢使用简单好记的密码

世界上没有绝对的安全,但当攻击成本远高于收益时,整个系统达到相对安全

明文存储?

即使仅从道德的角度来说,后端也不应该以明文形式存储用户密码。

2011年CSDN密码泄露事件和2016年的网易52G事件出现后,比他们数据库被盗这件事更令人震惊的是,他们泄露的数据库里的密码居然全部都是明文。

明文存储的方法将安全性全部下放给了运维人员、开发人员和管理人员:

从运维层面看,任何操作系统漏洞、基础工具漏洞的发生,都会导致密码泄露

从开发层面看,任何代码逻辑有漏洞、任何依赖库的漏洞都可能导致密码泄露

从管理层面看,任何一个有权限读取数据库的人,都能看到所有用户的密码

由于前提1(大家总是到处使用一样的密码),所以明文密码泄露之后,再使用撞库攻击,还能得到其他网站的用户密码,对用户造成更严重的危害。比如2014年的12306密码泄露事件里,12306并没有犯错,只是黑客收集了很多其他网站的明文账号密码,再去12306批量尝试登陆,就可以得到大量用户的12306信息。

所以,后端不应该以任何明文或可以转换回明文(如可逆的加密)的形式储存密码。由于储存的信息并不是明文,所以大多数网站的「找回密码」功能并不能真的告诉你密码,只能让你重新设置一次。如果你发现一个网站的「找回密码」功能真的找回了你的密码,那就要当心你密码的安全性了。

做个哈希?

要保存密码的某种可被验证的形式,又要让保存的数据「不可逆」,首先能想到的就是哈希了。

十年前,大多数网站保存的都是经过一次MD5哈希的密码。哈希保存的思路很简单:用户注册时,把他的密码做一次MD5运算储存起来;用户登录时,把他输入的密码做一次MD5运算,再验证是否和数据库里储存的一致。

在MD5被证明不够安全以后,大家又开始选择其他的哈希算法如sha256等。但除了哈希算法本身的安全性外,这种做法的缺陷很快暴露,就是应付不了彩虹表的攻击方式。

md5哈希

彩虹表就是把简单的数字密码组合(和各种常见密码)的哈希先尽可能的计算出来,这些明文和哈希结果的对应关系就是一张彩虹表。由于前提2(大家喜欢使用简单好记的密码),所以试着计算出一个常用范围内的所有字母组合的哈希的彩虹表,可以破解绝大多数人的密码。当彩虹表足够大时,这种存储方式实际上与明文无异。

下图是cmd5这个网站已经破解的明文范围。

md5数据

在这种储存方式下,一次运算出的彩虹表可以被使用无数次,均摊到每个网站的每个用户的成本是极低的,所以至今仍然有很多服务器在孜孜不倦地运算着md5哈希的彩虹表。这张彩虹表也在大家的努力下变得越来越大。

加盐哈希?

加盐哈希是目前业界最常见的做法。

加盐哈希的步骤如下:

用户注册时,给他随机生成一段字符串,这段字符串就是盐(Salt)

把用户注册输入的密码和盐拼接在一起,叫做加盐密码

对加盐密码进行哈希,并把结果和盐都储存起来

在登陆时,先取出盐,再同样进行拼接、计算哈希,就能判断密码的合法性。

加盐哈希的做法,既保证了储存数据的不可逆,又防止了上一章的彩虹表攻击方式。这种方式下,黑客拿到数据库后,如果再要用遍历所有常用的密码组合的方式做彩虹表,那他需要对所有

常用密码+盐值

进行哈希运算。而每个用户的盐值都不相同,之前彩虹表的「一次运算无数次使用」变成了「一次运算一次使用」。这样的成本是难以接受的,由于前提3(攻击成本远高于收益,系统达到相对安全),所以这是一个比较安全的做法。

除了密码,还有别的信息

除了密码以外,手机号等信息也是重要的隐私数据。但手机号与密码不同:对于后端来说,永远不知道密码的明文也不会对业务逻辑造成影响;而后端可能需要明文的手机号,在一些情况下给用户发送短信。

对于手机号这种信息,只能用相对安全的做法,即先对手机号进行对称加密,再将加密结果储存在数据库里;使用时再用密钥解开。

这时密钥不应该被保存在数据库里。如果数据库被拖库,那么些数据的安全性与明文无异。通常会将密钥以环境变量的形式放在服务器上。这时除非网站在被拖库的情况下同时被拿到服务器权限,否则手机号的明文就不会被泄露出去。

不幸的是,从今天AcFun泄露数据来看,A站对手机号应该也做了对称加密存储,但它就是在被拖库的情况下同时被拿到了服务器权限,所以手机号就以明文形式展示了出来。

除了数据库,还有别的地方

就在上个月,2018年的5月4日,twitter发布了一则公告,称他们从来不会把密码的明文储存下来,但他们自己发现了一个漏洞:密码被储存在请求日志里了。

在后端项目生产环境里,总是会打印并收集各种各样的日志。日志可以方便统计数据、在出错的时候回溯、调试bug。但是我们不应该总是打印和收集全部请求的正文内容,因为请求里可能包含密码等敏感信息。当日志被泄露时,用户数据同样会以明文形式直接泄露出去。

网站安全服务应该如何安全储存用户数据相关推荐

  1. Megaupload存储服务计划2017回归 原用户数据将恢复

    在传奇网盘服务Megaupload被FBI突袭查封的五周年之际,创始人Kim Dotcom在推特上宣布将在明年内完成Megaupload回归计划,Megaupload 2.0将会与Bitcoin等公司 ...

  2. 【读书笔记】安全存储用户数据

    文章:后端应该如何安全地储存用户数据? 总结: 一.用户信息之密码 讲密码的存储方案前,先要记住三条前提: 用户喜欢到处使用一样的密码 用户喜欢使用简单好记的密码 世界上没有绝对的安全,但当攻击成本远 ...

  3. 云空间服务,助力用户数据存储与协同

    当我们在使用电子设备时,存储无疑是最基础.最不可或缺的功能,随着信息膨胀,单纯依靠设备内存,已经不足以支撑储存全部数据,云空间应运而生. 云空间,顾名思义就是将大量数据存储在云端,减少设备内存的占用, ...

  4. RHEL4- WEB服务(十二)用户访问apache服务器认证

    RHEL4- WEB服务(十二)用户访问apache服务器认证   有些时候网站上的内容不是希望所有的用户都可以访问,由于网页内容性质的不同,会对来访的用户有所分类,网站的提供方希望部分网页内容只提供 ...

  5. 《2017 云计算评测报告》:带你了解 AWS、阿里云、腾讯云等八家云计算服务提供商的综合用户体验情况...

     报告电子版至听云官方博客下载:http://blog.tingyun.com/web/article/detail/1352 评测说明 评测目标:同一应用(网站)在不同云上的用户访问体验,以及对云资 ...

  6. Spring学习笔记(二十三)——实现网站微信扫码登录获取微信用户信息Demo

    目录 微信扫码登录介绍 开发步骤 微信扫码登录示例 微信开放文档 遇到的问题 使用第三方工具实现网站微信扫码登录 开发前介绍 开发步骤 微信扫码登录获取微信用户信息Demo实现流程 实现效果 实现过程 ...

  7. 盘点国内外十大免费CDN网站加速服务

    盘点国内外十大免费CDN网站加速服务 核心提示: 除了传统的CDN厂商之外,云服务商也开始进驻该领域,市场上可供选择的免费的CDN还是比较多的,在此罗列出十大免费CDN,供寻找免费CDN加速服务的朋友 ...

  8. 10款国外免费网站在线监控服务工具

    我们任何人不能保证自己能够24小时在电脑前,即便我们有选择高富帅VPS主机产品也不能100%的确保不出现任何问题,有些时候可能是服务商机器稳定性问题,也有的时候是我们自身网站出现问题导致VPS主机的宕 ...

  9. 攻克微服务中的最大难点:用户数据

    今天 数人云与大家分享的文章将探讨微服务架构的创建与开发工作当中最为困难的部分--用户数据. 只有我们摆脱自己的依赖时微服务才能起作用,换言之,存在于单一数据库上的多任务进程并不是真正的微服务.使用S ...

最新文章

  1. android下载后的app自动安装,Android 7.0 下载APK后自动安装
  2. mhd格式三维图像显示_人体面骨三维有限元模型重构及碰撞分析
  3. echarts一个页面有多个tooltip_可视化工具ECharts入门
  4. linux 管道--转
  5. openstack热迁移配置注意事项
  6. C语言第三次博客作业---单层循环结构
  7. (pytorch-深度学习)批量归一化
  8. 关于vue.js 编程导航的使用:实现路由配置和跳转页面
  9. 支付宝在线支付接口开发教程
  10. Java新手学习路线
  11. Python安装指南
  12. 190728每日一句 不经一番寒彻骨 怎得梅花扑鼻香,一个人怎样保持激情去奋斗?
  13. gcc下载及安装教程
  14. AHP(层次分析法)学习笔记及多层权重Python实践
  15. plc程序ST语言接近C语言,【PLC高级编程语言之ST文本】4.ST语言的运算符介绍
  16. C#XtraReport学习之二 winform打印按钮
  17. 常用文本编辑器(NotePad++,UtraEdit)
  18. 如何修改ICO文件的尺寸
  19. spyder快捷键大全
  20. 月圆之夜-体验报告(完稿时间2021/6/11)

热门文章

  1. 从零搭建个人博客(4)-留言评论区
  2. 阿里巴巴校园招聘2019面试总结
  3. 有序与无序(Order and disorder)
  4. python练习实例——芯片测试
  5. linux下mysql大小写区分问题
  6. DAVINCI DM365-DM368开发攻略——U-BOOT-2010.12及UBL的移植
  7. 海图(基于http服务器的图片管理工具)
  8. P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
  9. 什么是GNU/Linux?
  10. 新版MyDockFinder不再仿Mac??一招教你解决