密码,是敏感又重要的信息。对密码的处理是非常重要的。那么在web系统该如何处理密码呢?在下略有心得,备忘如下。
密码的轨迹
用户 => 应用服务器 => 数据库
从用户在客户端/浏览器输入密码到传输到应用服务器,再存储到数据库。有很多措施可以用来提高密码的安全性。
用户 => 应用服务器
用户的原始密码经过http协议传输到应用服务器。
- 使用
https
。虽然前段时间出现
心血
漏洞,但是并不能说https
就没用了。 - 加密传输。
对原始密码进行单项加密可以有效提高破解成本,甚至完全杜绝渗透者获得用户的原始密码。虽然对于抓包者来说,仍然可以获得登录令牌,但至少他无法获得用户原始密码,不会把用户密码扔到社工字典里。很大程度上减少了密码泄露的损失。
密码加密有几点需要注意:
- 密码的加密一定要单向加密,一方面这样加密不影响使用,另一方面也比可解密的算法破解成本更高,从而提高了安全性。
- 选择多个语言都可以实现的算法。毕竟web系统基本都是多端的(web,ios,android等),一定要确保所有客户端都可实现才行。
- 权衡加密成本。如果加密需要额外软件包,从而增加安装包体积和依赖管理复杂度的话,就要根据实际情况有所取舍。
- 对于JavaScript。推荐:https://github.com/evanvosberg/crypto-js
应用服务器 => 数据库
服务器到数据库这一关也同样需要加密。当然,仍然是单向加密。这样,即使数据库被爆也至少不会让用户密码公之于众。 这里就PHP语言推荐两个函数:
- crypt()
这个函数比较奇妙,它会根据加的盐不同而使用不同的加密算法。这对破解者来说着实是个噩梦,不仅要破解算法,还要破解盐。
- password_hash
这是PHP 5.5开始增加的密码加密专用函数。如果生产环境已经使用PHP 5.5了,还是推荐使用这个函数。
时间: 2024-10-29 19:06:54