微软:暴力破解面前,增强密码复杂性基本没用
我们都痛恨密码,然而不幸的是在当下及可以看见的未来里,账户登录等在线认证操作的主要方法还是需要使用密码的。密码认证有时确实比较烦人,尤其是一些网站为了密码安全性,要求我们在设置密码时必须包含大小写字母、数字或特殊字符。
微软发布的最新研究报告称:增强密码复杂性基本是没有任何意义的。在本文中,我将简要分析一下微软的理论,并且与大家探讨下两个新的密码安全解决方案。
什么是暴力破解?
暴力破解攻击是指攻击者通过系统地组合所有可能性(例如登录时用到的账户名、密码),尝试所有的可能性破解用户的账户名、密码等敏感信息。攻击者会经常使用自动化脚本组合出正确的用户名和密码。更多信息请点我
http://www.freebuf.com/news/special/52361.html
增强密码复杂性基本没用
在密码能强大到无视社工字典的攻击后,采取的那种攻击称为暴力破解。这类暴力破解又分两种:在线破解和离线破解。
在线破解时,黑客通常使用与用户正常操作时相同的应用接口(比如登录时用到的web接口),因而可能被某些安全防控规则限制。然而由于离线破解的必要条件是黑客已经获取了密码文件,因而黑客们进行密码暴力猜解时通常是毫无忌惮、无所限制的。
微软安全研究人员发现,通过在线破解所尝试直至成功的次数最高约为100万次,而离线破解则达到了10亿次之多。
因此一个不太复杂的百万次猜解级别的密码“tincan24”与一个10亿次猜解级别的密码“7Qr&2M”相比,他们对于在线破解来说都是强密码,而通过离线破解则都不堪一击。同时后者还更加难以记住。
这就告诉我们,在离线暴力破解攻击面前,增强密码复杂性基本没用。
当密码文件泄露后
为了对抗密码文件泄露后的离线破解攻击,我们需要做一些防护措施。
在微软的报告里提到一个通用解决方案:
将每个密码进行加密,然后将密钥储存在硬件安全模块(HSM)之中。因为HSM并没有提供密钥的外部访问接口,所以想要解密密
文,只能通过应用程序走正常流程,那样即使拿到了密文也没有太大用处。
两个创新性防护方案
对于防密码文件泄露,国外安全研究者提出两个创新性的解决方案:
1、在Derbycon 2014大会上,Benjamin Donnelly和Tim Tomes提出了他们的“球链”(BAC)解决方案。BAC提供了一种方法,可以人工填充密码文件从而增加文件大小。当然,密码数据会安全地存放在文件里不会丢失,这样一来密码的猜解难度增大了许多。打个比方,黑客想要在线猜解一个2TB大小的密码文件,至少得花费1个月的时间。这么长的时间,再加上如此大的数据发送量,黑客的攻击有非常大的可能性会暴露。
2、以色列某新兴公司Dyadic,向公众展示了它的分布式安全模块(DSM)。DSM运用了最先进的分布式计算(MPC)加密技术,通过把每组密码进行分割后,分布式存储在多个服务器上。黑客想要破解密码,需要遍历多个服务器。由于各服务器有着不同的访问凭证,甚至操作系统也可能不一样,这会大大增加黑客的破解难度。
FreeBuf结语
把密码保护的重任压在用户身上是不科学的,作为安全研究人员,我们显然不能一味地要求用户增加密码复杂度。而诸如使用对称/非对称算法存储密码、加盐(salt)、加密机的使用似乎都是老生常谈,技术也并不新鲜。
有没有一些新的技术或方式可以提高密码及密码存储安全性?上文中国外的安全研究者抛出了两种方法,国内的同志们的呢?欢迎在本文评论中讨论和交流。
[参考来源securityweek,译/FreeBuf小编dawner,转载请注明来自FreeBuf.COM]
- gradle新建工程,多项目依赖,聚合工程
- Apache Hive-2.3.0 快速搭建与使用
- HBase-1.3.1 集群搭建 - 报错整理
- 分布式唯一ID生成器Twitter 的 Snowflake idworker java版本
- 使用 Phoenix-4.11.0连接 Hbase 集群 ,并使用 JDBC 查询测试
- 高并发分布式系统中生成全局唯一Id汇总
- ZooKeeper 可视化监控 zkui
- 关于RBAC(Role-Base Access Control)的理解
- Spring Boot 中使用 Kafka
- 如何评价一段代码
- java系统高并发的解决方案
- Spring Boot 中使用 Redis
- 使用 Jedis 连接操作 Redis
- 浅析ReDoS的原理与实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Nginx | Nginx的介绍和安装
- 真特么激动第一个爬虫----爬取豆瓣电影top250
- LeetCode | 141.环形链表
- LeetCode | 20.有效的括号
- springboot开发之实现登录功能
- springboot开发之国际化(中英文切换)
- LeetCode | 225.用队列实现栈
- springboot开发之显示员工信息
- LeetCode | 232.用栈实现队列
- springboot开发之thymeleaf页面公共元素的抽取
- Redis | Redis 通用命令
- python爬虫--自动下载cosplay小姐姐图片(xpath使用自定义创建文件路径)
- springboot开发之修改员工
- LeetCode | 703.数据流中的第K大元素
- springboot开发之配置自定义的错误界面和错误信息