专栏首页网管叨bi叨我们应该如何保护用户的密码

我们应该如何保护用户的密码

最近几年的新闻中一直有互联网头部公司系统被攻击导致用户密码泄露的新闻。那密码被破解肯定和当初项目伊始时选择的密码哈希方案造成的历史包袱有关。我们不讨论这些互联网巨头应该采用什么方案防止用户密码被破解,我知道的方案人家养的那些技术大拿更知道了。我们就来说一下,如果我们有机会自己从零开始做一个系统时,应该选择什么样的哈希算法有效防止用户的密码不被破解。

既然想保护用户密码不被破解,就先了解下破解密码的手段吧。

攻击密码的主要方法

我们需要防御的两种主要的密码攻击方式是:

  • 字典攻击
  • 暴力攻击

它们的工作方式非常简单:使用预先生成的密码哈希列表并进行简单的比较,以找到创建所需哈希的字符串。对于未加盐的密码,可以下载大量预先生成的密码列表。然后只需要简单查找即可。这种列表称被为彩虹表。

如果密码使用了盐,但没有为每个密码使用唯一的盐,那么攻击者要做的就是手动生成彩虹表,对每个组合使用盐,然后进行查找。如果你对每个密码使用唯一的盐,则攻击者需要针对每个密码为每个组合生成一个列表再去查找。这是另外一种类型的攻击,即暴力攻击。

暴力攻击通过反复尝试猜测密码来破解密码。与慢速哈希(例如bcryptscryptpbkdf2)不同,MD5SHA-1(或SHA-256SHA-512等)是消息摘要算法,它们旨在快速验证给定消息是否未被篡改。

一个常见的示例是验证下载的文件。下载文件后,在文件上运行MD5,然后将哈希与原始站点提供的哈希进行比较验证文件是否被篡改过。所以MD5SHA-1这些算法不是为密码设计的。因为这些算法的哈希速度会随着硬件计算能力的提升一起提升,如果你使用了这些算法做密码哈希,那么不论密码加没加盐,加盐后做了几次哈希,破解密码的的时间都会随着计算机硬件的提升越来越短。

哈希算法速度比对

在2012年的演讲中,Jeremi M. Gosney使用商业级硬件测试比对了各种哈希算法的性能。该测试使用五台服务器,并带有18个消费级显卡:

  • 10x HD 7970
  • 4x HD 5970 (dual GPU)
  • 3x HD 6990 (dual GPU)
  • 1x HD 5870

得出的结果如下:

鉴于硬件的进步速度,我们应该期望今天使用相同的硬件的花费会大大降低,或者使用今天的硬件,性能会比2012年时提高大约6-8倍。

上面的图表里的结果显示如果你(2012年)仍在使用未加盐(或非唯一)的MD5哈希值作为密码,那么2012年使用此配置硬件的的攻击者每秒可以进行180,000,000,000次哈希。即使是最复杂的SHA算法(SHA-512),其速度比MD5慢49,000,000倍,但每秒也可以计算36.4万次哈希。

另一方面,bcrypt每秒仅能执行71,000次哈希。这比MD5慢253,500,000%,比SHA-1慢88,700,000%,甚至比SHA-512慢412%。

总结

很多系统中在存储用户的密码前会对密码加盐并增加密码哈希的次数,以减慢密码暴力攻击的速度。例如执行五次MD5迭代,但即使是这样仍然只能使尝试破解次数减少到每秒36,000,000,000次,是单个SHA-1的两倍,并且仍然比SHA-512快99.99898%,而使用bcrypt则要慢443,000,000%。所以bcrypt是一种很好的散列密码解决方案,可以有效地防止暴力破解和字典攻击。

下一篇文章我们将展示,在Go语言写的项目里如何使用bcrypt进行密码哈希。

PS. 你的项目用的密码哈希解决方案是什么?用什么语言实现的?来留言里说说吧。

本文分享自微信公众号 - 网管叨bi叨(kevin_tech),作者:KevinYan11

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 容器化Go应用--基础镜像的未知时区问题

    用Go开发的应用程序的一个优势在于,可以从"零"开始构建应用的Docker镜像,镜像中仅需要包含Go应用程序编译后的二进制文件,不需要额外安装其他执行环境。这样...

    KevinYan
  • go中defer的一个隐藏功能

    在开始使用Go进行编码时,Defer是要关注的一个很重要的特性。它非常简单:在任何函数中,给其他函数的调用加上前缀 defer以确保该函数在外部函数退出之前立即...

    KevinYan
  • 七张图了解Kubernetes内部的架构

    Kubernetes是用于管理容器化应用程序集群的工具。在计算机领域中,此过程通常称为编排。

    KevinYan
  • JDK源码分析之集合04HashMap

    代码改变世界-coding
  • WEB开发将不再重度依赖JS【二】

    前阶段写了一篇文章 "WEB开发将不再重度依赖JS",介绍了 WASM(WebAssembly),因为有了最新消息,所以写了这篇文章来分享 简单回顾一下 WAS...

    dys
  • 程序员如何解决时间利用率不高这个大bug?

    一直感觉自己时间不够用,因此学习过 GTD 和番茄时间管理法等,每种管理法都有自己的优缺点,也有自己不习惯的部分。经过一长段时间(接近两年)的实践与改良、结合番...

    架构师小秘圈
  • 新电池入手

    libo1106
  • nodejs里require的调试截屏

    const TCPClient = require(’…/modules/tcpClient/index’)

    Jerry Wang
  • PowerBI DAX 度量值管理 - 驾驭度量值依赖关系,删除无效

    很多小伙伴说跟着罗叔已经学习到了很多,一个报告写了几百个度量值了,现在想查找和删除没用的,怎么办呢。

    BI佐罗
  • 个性化推荐系统(八)--- 机器学习深度学习召回集扩量

    个性化推荐系统评价有两个重要指标,一个是召回率一个是准确率。召回率就是:召回率=提取正确信息条数/样本中信息条数。准确率就是:准确率=提取出正确信息条数/提取信...

    杉枫

扫码关注云+社区

领取腾讯云代金券