写点什么

Dropbox 是如何安全地存储用户密码的

  • 2016-12-25
  • 本文字数:970 字

    阅读完需:约 3 分钟

不久前,来自 Dropbox 的 Devdatta Akhawe 在官网博客上公开了Dropbox 为保护用户密码安全所采取的措施。

存储密码明文是一件很拙劣的事情,相信不会有人这么做的。早在1976 年,计算机行业就推行了单向散列机制,我们存储的是密码的散列值,而不是密码本身。这种方式虽然杜绝了密码被反向破解出明文,但却阻止不了不怀好意的人对其进行暴力破解。暴力破解虽然耗费时间,但被“猜”出密码是迟早的事。SHA 散列算法速度很快,一个商用CPU 每分钟可以算出几百万个SHA256 散列值,而有些GPU 群集每秒钟可以算出几十亿个

加密和破解是一场你追我赶的长期斗争。Dropbox 作为一个应用范围很广的云存储解决方案,他们又是如何保证用户的密码安全的呢?

Dropbox 的加密机制构建在三层加密基础之上,从里到外就像洋葱一样层层叠加。他们先是使用 SHA512 散列算法对明文密码进行散列,然后针对散列值进行 bcrypt 再散列。为什么在 bcrypt 之前要先做 SHA 散列呢?有些 bcrypt 实现会把散列值长度截至 72 字节,从而降低了密码的熵值,而有的则允许变长密码,这样容易受到 DoS 攻击。使用 SHA512 散列可以得到固定长度的 512 字节散列值,避免了上述的两个问题。

在 SHA 散列之后是 bcrypt 散列。bcrypt 散列算法是一种加盐(salt)散列算法,每个密码都有不同的“盐”,并且是分开存储的。bcrypt 速度比较慢,这样就很难通过硬件加速来加快破解速度。而且 bcrypt 散列使用了成本因子 10(每个因子相当于每一步计算需要耗费 100 毫秒的时间),这样就更是加大了暴力破解的难度。

经过 bcrypt 散列之后,散列值会再次经过 AES256 算法的加密,这次加密会使用到秘钥,也就是所谓的“胡椒粉”(pepper)。胡椒粉也是被单独存储的,所以就算密码被偷了,没有这些胡椒粉,那些不怀好意的人也拿它们没办法。

经过 SHA512、bcrypt 和 AES256 的三层加固,用户就可以高枕无忧了。不过之前说过,加密和破解是一场永不停止的战争,所以 Dropbox 在保护用户密码安全这项工作上永不停息。三层加固只是其中的一个环节,他们还部署了应对在线暴力破解的防护层。另外,他们还在积极地研究更多能够给用户的安全锦上添花的解决方案。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-12-25 18:002289
用户头像

发布了 322 篇内容, 共 144.3 次阅读, 收获喜欢 148 次。

关注

评论

发布
暂无评论
发现更多内容

如何搭建一个HBase集群

Rayjun

HBase

图说前端-内存管理(1/3)

梦见君笑

大前端 内存

如果你想写自己的Benchmark框架

程序那些事

JVM 性能调优 GC benchmark

redis系列之——Redis为什么这么快?

诸葛小猿

Java redis 程序员

如何基于 BitMap 进行海量数据分析

GrowingIO技术专栏

互联网 数据分析 科技互联网 数据化

基于Kubernetes实现的大数据采集与存储实践总结

岿然独存5

Docker Kubernetes S3 EFK Fluentd

redis里的数据结构

流沙

redis

那些让程序员目瞪口呆的Bug

Java小咖秀

程序员 bug

计算机的时钟(一):NTP协议

ElvinYang

DOM 树的构建

法正

html 大前端 DOM

图说前端-使用Atomics避免SharedArrayBuffers中的race conditions(3/3)

梦见君笑

大前端 内存管理

RESTful 架构及实践

Geek_z9ygea

Java 大前端 RESTf

java 后端博客系统文章系统——No3

猿灯塔

Git 常用操作汇总-cheat sheet

多选参数

git GitHub gitlab gitee

计算机操作系统基础(十七)---进程同步之Unix域套接字

书旅

php laravel 线程 操作系统 进程

使用 Dockerfile 创建镜像 | Docker 系列

AlwaysBeta

Docker 容器 镜像 Dockerfile

玩转Redis高可用 - 哨兵(Sentinel)模式

Man

高可用 redis高可用 中间件

图解:深度优先搜索与广度优先搜索

淡蓝色

Java 数据结构 算法

ARTS 打卡 第2周

Scotty

Java 线程的生老病死

武培轩

Java 线程 多线程 并发 线程状态

架构师训练营第六周作业

张明森

猿灯塔:spring Boot Starter开发及源码刨析(三)

猿灯塔

Java 猿灯塔

架构师必须知道的架构知识

Chank

架构 架构师 Architecture Architect

刘华:上云还是不上云,这是一个问题

刘华Kenneth

架构 敏捷

无价值人生记录.0:浪费1000%时间去做一个用来节省1%时间的“轮子玩具”(上:因缘)

八苦-瞿昙

C# 程序员 随笔 随笔杂谈 aop

《精益思想》读后感分享

zhongzhq

高效工作 精益 精益思想 精益生产方式

给 Spring Boot 项目减减肥!18.18M 到 0.18M 是如何做到的?

给你买橘子

Java 程序员 Spring Cloud 编码 SpringBoot 2

游戏夜读 | 如何分析游戏体验?

game1night

啃碎并发(九):内存模型之基础概述

猿灯塔

Java 猿灯塔

图说前端-ArrayBuffers 和 SharedArrayBuffers(2/3)

梦见君笑

大前端 内存管理

分布式系统的一些基础理论

俊俊哥

分布式事务 CAP Base

Dropbox是如何安全地存储用户密码的_语言 & 开发_薛命灯_InfoQ精选文章