网站如何安全地存储和传输用户密码

网站如何安全地存储和传输用户密码

不同角度对安全的定义

密码系统安全性应满足的条件

  1. 系统在理论上是不会被破译的,也不能在实践中被破译。
  2. 系统的机密性不依赖于加密/解密算法和系统的加密,而只取决于密钥的机密性。
  3. 易于添加/解密操作、在软件/硬件中快速且易于实现。
  4. 加密/解密算法对密钥空间的全部元素均可用。

测量密码系统安全性的基本标准

  1. 计算安全:解密加密算法的计算能力与计算时间在实际条件下不可用。
  2. 安全证明:密码系统的解密依赖于对数学问题深入研究的解决方案。理论上保证安全。
  3. 无条件的安全:攻击者不能在用没有限制计算能力与时间的基础上破译加密算法。极限状态下的安全。

除了一次性加密算法,理论上还没有绝对安全的密码系统。在实际应用中,只要能够证明所采用的密码系统是计算安全的,就有理由相信加密算法是安全的。[1]

安全地存储密码

委托给可信任的第三方存储——OpenID技术

OpenID的理念是用第三方来完成用户验证。

目前国外的网站如谷歌、雅虎等,国内的如腾讯等都已经提供OpenID服务。

如果我们开发一个网站并选择谷歌的OpenID服务,那么用户就可以用Gmail的账号和密码登录,接下来用户认证的事情将由谷歌完成。

优点:

  • 没必要自己存储用户名和密码,也就没必要考虑存储密码的安全性问题,从而减少开发的成本。
  • 用户不用在网站上注册新的用户名和密码。这样既免去了填写资料的麻烦,也减去了记住一对新的用户名和密码的负担。

用Hash算法加密密码

常用的几种单向的哈希算法:

  • MD5(已被破解,不建议在产品中使用)
  • SHA系列(SHA1、SHA256、SHA384、SHA512等)

只使用哈希算法还是不够安全:

  • 猜测密码,找有没有相同的哈希值(类似离线攻击)

  • 彩虹表(事先计算好大量密码与对应的各种哈希算法的哈希值)

加盐提高安全性

为了应对彩虹表,我们可以先往明文密码加盐,然后再对加盐之后的密码用哈希算法加密。

所谓的盐是一个随机的字符串,往明文密码里加盐就是把明文密码和一个随机的字符串拼接在一起。由于盐在密码校验的时候还要用到,因此通常盐和密码的哈希值是存储在一起的。

需要注意的是:我们要确保往每个密码里添加随机的唯一的盐,而不是让所有密码共享一样的盐。(否则可以针对这个盐生成彩虹表)

破解方法:

  • 穷举法。由于哈希算法的快速高效,任何6位的纯数字密码即使加盐之后也能在数秒之内破解。随着计算能力的提高,黑客们低成本并且高效地破解高级别密码愈发存在可能。
  • 通过历次密码泄露事件收集大量常用密码。这些常用的密码即使加盐也很容易破解。

用BCrypt或者PBKDF2增加破解的难度

为了应对暴力破解法,我们需要非常耗时的哈希算法。BCrypt算法应运而生。

BCrypt最大的特点是我们可以通过参数设置重复计算的次数。显然,重复计算的次数越多耗时越长。

目前已有开源项目(http://bcrypt.sourceforge.net/)实现了BCrypt算法并被业界广泛采用

PBKDF2同样也可以通过参数设定重复计算的次数从而延长计算时间。[3]

安全地传输密码

非对称加密

非对称加密的模式是:

  • 乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的
  • 甲方获取乙方的公钥,然后用它对信息加密
  • 乙方得到加密后的信息,用私钥解密。

即使黑客拿到了公钥,没有私钥也是没有办法解密,不考虑彩虹表的情况,完全可以长期使用一对秘钥。[6]

GPG加密

GPG全称 GNU Privacy Guard,是非对称加密。

如果你想给谁发送加密信息,首先你要得到他的公钥,然后通过该公钥加密后传给他,对方利用自己的私钥就可解密并读取文件了。[4]

RSA算法

RSA算法原理:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

对称加密

对称加密的模式是:

  • 甲方选择某一种加密规则,对信息进行加密
  • 乙方使用同一种规则,对信息进行解密[6]

对称加密两种常用算法:

  • 分组密码:每次只对固定长度的比特块进行加密,比如DES;
  • 流密码:将提供的大量比特作为输入并可连续运行,从而加密;[5]

客户端和服务端进行通信,采用对称加密,如果只使用一个秘钥,很容易破解;如果每次用不同的秘钥,海量秘钥的管理和传输成本又会比较高。[6]

HTTPS

基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。

特点:

  • 内容加密:采用混合加密技术,中间者无法直接查看明文内容。
  • 验证身份:通过证书认证客户端访问的是自己的服务器。
  • 保护数据完整性:防止传输的内容被中间人冒充或篡改。[7]

其它可能的攻击方式及相应的防范措施

这里只考虑从网站服务器上破解用户密码的方法。

在线攻击

通过代码在网站的用户验证环节试探用户的用户名和密码。

攻击之前需要获取网站的网站协议(http,https,ftp,pop3,…)、完整的登录url(一般不可见)、登录失败信息(Login failed,请检查用户名、密码,…)。

攻击流程:比如要攻击用户'Admin'的密码:使用程序循环模拟用户登录行为,从字典中依次选取密码,组装后向网站发送登录请求(request),接收网站的反馈信息(response)并加以分析,如果没有返回登录失败信息,说明攻击成功。

现有的软件工具:

  • 获取网站基本信息:BurpSuite
  • 表单密码破解:hydra

防范措施:

  • 验证码、滑块拼图、限制失败登陆次数等。无法彻底杜绝。[2]

离线攻击

将获取的哈希密码保存到本地,利用自己的计算机对密码进行离线破解。

必须要先判断密码的加密方式。之后将字典中的密码进行依次加密、比对。[2]

现有的软件工具:

  • John the Ripper
  • hashcat

防范措施:

  • 优化哈希密码的存储技术,采取特殊的加密方式等。

参考

[1] 渔翁信息. 密码系统安全性的定义 [EB/OL]. https://www.fisec.cn/1244.html, 2019-02-12

[2] 平平说科技. 黑客技术入门:密码攻击的原理和方法 [EB/OL]. https://cloud.tencent.com/developer/news/313489, 2018-09-13

[3] 星朝. 如何安全地存储密码 [EB/OL]. https://www.cnblogs.com/jpfss/p/11024665.html, 2019-06-14

[4] 守株待兔. GPG 加密解密简明教程 [EB/OL]. http://blog.sina.com.cn/s/blog_71f3890901011ig0.html, 2012-04-19

[5] kph_Hajash. 网络信息传输的安全机制 [EB/OL]. https://blog.csdn.net/chuanglan/article/details/80627366, 2018-06-08

[6] 徐辛承. 如何加密传输和存储用户密码 [EB/OL]. https://zhuanlan.zhihu.com/p/36603247, 2018-05-09

[7] 会飞的狗~. HTTP和HTTPS协议,看一篇就够了 [EB/OL]. https://blog.csdn.net/xiaoming100001/article/details/81109617, 2019-08-03

猜你喜欢

转载自www.cnblogs.com/wr786/p/12112042.html