层出不穷的用户密码数据库泄露事件对用户会造成巨大的影响,因为人们往往习惯在不同网站使用相同的密码,一家“暴库”,全部遭殃。那么我来分析一下如何安全的存储密码呢?
将明文密码做单向哈希后存储。
单向哈希算法有一个特性,无法通过哈希后的字符串恢复原始数据,值得注意的是这是哈希算法而不是加密算法。常用的单向哈希算法包括MD5、SHA-256、SHA-1等。
例如,对密码 “hooyes” 进行MD5哈希后的字符串如下: “0be67d59cd4a5ff3e582761941472c1b”
单向哈希有两个特性:
1.从同一个密码进行单向哈希,得到的总是唯一确定的字符串并且长度都是一样。
2.计算速度快。随着技术进步,一般的计算机都能够完成数十亿每秒单向哈希计算。
结合上面两个特点,考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合, 然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为rainbow table。 换句更通俗的话来说,只要看到这一串 “0be67d59cd4a5ff3e582761941472c1b” 不管在哪家数据库,那轻易的就能知道密码是 “hooyes”。
所以进行简单的哈希存储后,如果泄漏了数据库,这样的密码存储依然是不够安全的。
每个设备中都会存有一些默认的可信的根证书,但很多CA是不使用根证书进行签名的,而是使用中间层证书进行签名。
如果你的服务器上没有中间件证书,这样的结果就是你的服务器上只有你的网站的证书,客户端的浏览器里只有CA的根证书,这样就会导致证书信任链不全,会导致 “网站证书不可信且证书链长度为1,服务器没有配置完整证书链”。
这种中间层证书不全的问题多出现在移动端的浏览器上,而且以Android为主。
当你服务器上的证书中的信任链不全的情况下,浏览器会认为当前的链接是一个不安全的,会阻止页面的打开。
一般我们拿到的证书是这样:
-----BEGIN CERTIFICATE-----
# 你的网站证书内容
-----END CERTIFICATE-----
为了解决缺少中间层证书的问题,我们可以手动增加证书内容,修改后为
-----BEGIN CERTIFICATE-----
# 你的网站证书内容
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
# 中间层证书内容 例如:Let's Encrypt Authority X3
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
# 顶层证书内容 例如:DST Root CA X3
-----END CERTIFICATE-----
关于phpredis扩展,我推荐github上开源的 phpredis 简单易用。
本文是在MacOS中操作完成,其他系统可以酌情修改目录。
PHP7安装的目录是:
/usr/local/Cellar/php@7.0/7.0.32/bin
本文用的是 phpredis-4.1.1 下载地址: https://github.com/phpredis/phpredis/releases
PHP7 安装redis扩展的操作方式与老的PHP版本一致。