如何正确的进行密码保护?

前言

密码加密很重要,如果泄露是后台管理员的用户密码,会严重的损害系统的安全性;如果密码不加密直接明文存储到数据库,一旦数据库泄露,密码也会泄露,而大部分人在不同网站上用的密码都是一样的,黑客拿到密码便可以攻击该用户的别的网站的账号(据说之前csdn就报出密码明文存储的事情)。

密码加密很重要,但是很多人忽视了。用户的密码设置过于简单、程序员在开发时未考虑密码的加密。这一切都导致做出来的web系统让黑客进出自如。

这篇文章试图从多个角度去探讨,作为程序员,我们应该如何处理好密码,如何更好的对密码进行加密。

1、源头上遏制弱口令

众所周知,网络上常常有弱口令密码表,黑客只需要遍历弱口令表去试探密码,就可以完成这一暴力破解过程。
因此一个好的方式是,从源头上拒绝弱口令的出现:

  1. 密码的长度应该达到8位以上
  2. 密码应该同时由数字、字母和其他字符组成
  3. 密码和用户名不应该存在联系
  4. 密码不应该和上一次设置的密码相似(重置密码时)
  5. 定时,如半年进行密码的修改
  6. 应该有确认密码机制,防止密码过于复杂,用户误输入
  7. 用户名要有最短长度限制,用户名不应该可以其他用户重名

如何进行验证?

  • 前端进行验证,验证密码和确认密码一致、验证密码长度、复杂度符合要求,同时和用户名不存在强的关联(可以用KMP算法)
  • 后端需要将前端验证的那几项再验证一次,因为前端的数据往往是不可信任的,通过一些方式可以很轻松的绕过前端的验证
  • 后端接着校验密码和上一次设置的密码不相似

2、主动防御

我的理解是:给密码加密属于被动防御,它并没有阻止黑客进行攻击,只是增加了攻击的复杂度而已。
而主动防御则是限制用户只能从前端界面进行登录(一定程度上限制了黑客使用脚本),从而提高了密码被破解的难度。

  • 设置图片验证码,这一方法能一定程度上阻止脚本频繁请求网站,从而防御黑客
  • 设置密码输入错误达到一定次数锁定账户
    • 这种方式能有效的应对黑客的暴力解密
  • 设置前置登录条件
    • 前置登录条件指的是在登录之前必须要做一些事,才能进行登录:
    1. 比如说需要绘制手势密码
    2. 比如说要按一定顺序点击页面某些特定的地方后(这里可以在点击某些特定的地方时发送特定的请求),后端将这些点击的顺序存入缓存,满足一定顺序和正确性条件后才允许请求登录接口),这种很适合用在一些私人性质很强的系统中。保密性也不错,毕竟很少人能想到在登录之前必须要点击某些地方。
    3. 比如说需要从一系列图片中选择出正确图片
  • 设置登录锁定IP,如果要在另一个IP登录,则需要进行手机或者邮箱验证码验证
  • 直接设定每次登录都要进行手机或者邮箱验证码验证

3、简单的办法来保证密码传输时的安全性——使用HTTPS

在这里插入图片描述
在这里插入图片描述

客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。

(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

(5)Web服务器利用自己的私钥解密出会话密钥。

(6)Web服务器利用会话密钥加密与客户端之间的通信。

因此,使用了SSL之后,信息在传输时便已经进行了加密,明文密码在传输时也得到了加密。
很多人没有意识到有这么一个简单的方式来进行密码传输时加密。这比自己实现的简单加密安全性要高。

4、一个简单的密码验证流程

如果1、2、3步骤都做了,那哪怕密码使用明文传输,安全性也不会低了。

对于很多系统并不要求达到很高的安全性(应该基于系统和数据的重要性去研究是否使用复杂的加密手段),我们可以基于HMAC这种密钥哈希算法,就可以提高很多的安全性:

  • 前端密码加密:
    1. 前端请求登录,后端回复一个随机字符串,并存在session中
    2. 前端使用HMAC(密码明文 + 随机字符串)=》密码密文,发给后端
  • 后端密码加密:
    1. 后端从数据库取出AES密码密文
    2. AES解密获得密码明文
    3. HMAC(密码明文 + 随机字符串)=》密码密文
    4. 和前端的密文对比,正确则登录成功

这里数据中的密码不是明文,而是使用了AES加密,这是防止黑客如果成功侵入数据库的话,明文密码泄露。并且由于数据库的加密算法和登录的算法不相同,因此不会出现,黑客拿着数据库密码请求登录接口就能用的情况。

5、结合验证码进行高级安全加密

现在几乎所有的网站、APP都有使用登录验证码。但不是都用来进行加密。
登录验证码的主要用途:

  1. 防止机器人、爬虫。(多见一些图片验证码、拖曳人机验证)
  2. 用户身份验证,增加用户注册成本。(手机验证码、邮箱验证码)
  3. 保证登录的时效性。(一般登录验证码都有时效)
  4. 结合密码进行加密

基于验证码,我们能够得到一种较安全的加密思路:

  • 前端登录加密规则

    1. 从后端获取RSA公钥
    2. RSA加密(密码明文 + 验证码,RSA公钥)=》混合密文
    3. 将混合密文发给后端
  • 后端登录验证/获取密码

    1. RSA解密(混合密文,RSA私钥)=》 密码明文 + 验证码、
    2. 从缓存读取验证码,如果过期则返回验证码已过期
    3. 对验证码进行验证(注意此处要用RSA解密得到的验证码)
    4. 将HMAC加密(密码明文,HMAC密钥)和数据库中存储的密码密文对比
    5. 对比成功,返回登录成功,反之登录失败
  • 为什么要进行前端加密?

  • 简单说就是前端到后端的这段过程密码很可能被拦截。这可以一定程度上防御中间人攻击。

  • 为什么前端加密要和验证码一起加密?

  • 糅合验证码,提高时效性。如果密码密文在发送期被拦截,这个密码只在验证码过期前有效。同时要求必须要和缓存的验证码一致,可以保证登录是在浏览器页面进行的(除非用ORC去识别验证码图片)。

  • 为什么前端注册要用RSA进行非对称加密?

  • RSA是当下最安全的加密算法之一,只要RSA密钥的长度足够(1024差不多够了),黑客得不到RSA私钥,几乎无法破解得到密码的明文。

  • 为什么密码存到数据库之后还要进行HMAC加密?

  • 这只是最后一道手段,因为假设黑客已经黑入了数据库(通过sql注入或者别的什么方式,但是仍没有黑入服务器),此时所有的密码都会在他的眼前,他可以通过这些密码,达到登录的目的。而如果再加一层HMAC加密,并将HMAC密钥存储在文件中而不是数据库中,黑客几乎无法利用这些密码。别提解析明文,连用来登录此系统都不行。

  • 密码加密之后就无忧了吗?

  • 错,基于跨域攻击获取cookie的方式,或者拦截获取token的方式,黑客仍然可以伪造用户已登录的状态。通过文件上传漏洞,黑客可以运行脚本,控制服务器。通过xss攻击进行js注入,可以将用户的信息发到自己的网站。因此,web安全永远是木桶效应——你能达到的安全性取决于你的短板,而不是你做的最好的那个方面

参考&引用

为什么HTTPS比HTTP安全,以及两者的优缺点
https://www.cnblogs.com/zhangsanfeng/p/9125732.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值