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

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

攻击密码的主要方法

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

  • 字典攻击
  • 暴力攻击

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

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

暴力攻击通过反复尝试猜测密码来破解密码。与慢速哈希(例如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进行密码哈希。

参考链接

Password Security

近期文章推荐

Go Web编程--给自己写的服务器添加错误和访问日志

关于如何收集,标准化和集中化处理Golang日志的一些建议

我们应该如何保护用户的密码相关推荐

  1. 你是如何保护用户的密码的?

    只要有会员系统的网站就会涉及到密码,如果处理不好就会造成前阵子那种事.下面我就说说我在开发时是如何处理密码这块功能的. 首先,密码必须加密,但简单的MD5加密已经没有太大意义,为了防止字典破解,我会给 ...

  2. 如何安全的存储用户的密码

    大多数的web开发者都会遇到设计用户账号系统的需求.账号系统最重要的一个方面就是如何保护用户的密码.一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码,即使网站被攻破的 ...

  3. 12306加密传输_前沿一键发送“文图音视频” 支持加密传输、图形密码、保护用户隐私……5G消息要来了!...

    点击上方"中国信息安全" 可订阅 从驿寄梅花.鱼传尺素,到网络聊天.视频通话,纵观人类发展史,通信始终不可或缺且不断变迁. 过年群发的祝福语.情侣之间的甜蜜互动.朋友互相分享的心灵 ...

  4. 如果计算机用户有密码 待机,电脑待机密码怎么设置

    篇一:在待机状态下怎么设置密码 在待机状态下怎么设置密码? 为当前用户设置一个密码,离开座位时,按win+L键锁定计算机就可以了. 请问取消win+L键锁定计算机怎么取消? 开始,运行 输入 net ...

  5. 域用户更改密码提示拒绝访问_AD域中的ACL攻防探索

    前言关于域内ACL的攻防近两年经常被人所提起,同时也产生了很多关于域内ACL相关的工具和攻击方式,本文将会从ACL的概念谈起,然后介绍几种不同的域内攻击方式以及如何监测和防御对于ACL的攻击.ACL的 ...

  6. 微软将取缔 8 亿 Windows 10 用户的密码!

    无密码时代即将来临. 作者 | Davey Winder 译者 | 弯月,责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 近日,微软将取缔Windows 10密码的说法得到了证实.微软的 ...

  7. 多少天计算机通知用户更改密码,win10系统怎么设置电脑定期强制提醒用户更改登录密码...

    很多win10系统用户都喜欢设置开机密码来保护电脑安全,但是固定的登录密码一段时间会显得不安全,所以定时更新密码会有利于保护电脑的安全,但是很多用户都会忘记定时更改登录密码,那么我们可以设置电脑定期强 ...

  8. 计算机密码应用基础,福师《计算机应用基础》在线作业一 要退出屏幕保护但不知道密码 可以...

    福师<计算机应用基础>在线作业一 要退出屏幕保护但不知道密码 可以 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 计算 ...

  9. 用户在离开计算机锁定功能,短暂离开也不怕 轻松锁定保护用户隐私

    鼠标键盘玩"锁定" 当前人们都很重视对隐私的保护,也希望能通过软件来实现对计算机软硬件的有效管理,包括将硬件.程序进行"锁定"操作,使得只有自己才能对其进行操作 ...

最新文章

  1. lifekeeper for linxu安装步骤
  2. Python文件夹与文件的操作
  3. 1491. Look and Say
  4. android 在什么情况下会主动gc_Python 什么情况下会生成 pyc 文件?
  5. jmeter找不到java_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
  6. 【Python】Matplotlib分层绘制投影柱状图
  7. php 判断编码 错误,请教一个 PHP 代码出错的原因(一个简单的计算器)
  8. Windows 8 Directx 开发学习笔记(三)摄像机设置及控制正方体旋转
  9. 21个php常用方法汇总
  10. C++开发技术的应用有哪些?
  11. input type=file与cursor:pointer的兼容性问题
  12. 枚举、自动装箱与注解(元数据)
  13. 创蓝云智短信接口发送短信函数
  14. 失传千年AE特效真经(三)
  15. 新计算机是飞行模式怎么开,win10自己打开飞行模式,怎么处理
  16. Visual Studio中的rc是什么文件
  17. 科拉茨猜想c语言编写,辽宁省沈阳市第一七O中学2019-2020学年高二数学上学期阶段性测试试题(2)文...
  18. 74HC245三态输出八路信号收发器
  19. Linux 编辑doc,玩转Linux vi编辑器.doc
  20. 【Python办公自动化】快速将excel按照某列不同的值批量拆分

热门文章

  1. Ibatis 生成工具ibator的使用 适用于ibaits2
  2. servlet--百度百科
  3. PHP extension mcrypt must be loaded.
  4. Python中的类属性和实例属性以及静态方法和类方法
  5. vs2010 代码混淆 代码加密
  6. IIS6.0不支持ASP的解决办法
  7. kaldi 源码分析(七) - HCLG 分析
  8. Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg...
  9. “针对即席工作负荷进行优化”如何影响你的计划缓存
  10. 最全金蝶KIS记账王使用问题汇总