数据库中如何保存密码

网站开发一般都会涉及到数据库设计,而数据库设计大多数情况都会涉及到密码的保存。近几年发生过多起网站用户信息泄露事件:CSDN 用户账号及明文密码泄露,网易邮箱过亿用户数据泄露 等等。通过这些事件,大家对网络安全也越来越重视,而信息安全中最重要的一项就是密码,用户如何选择密码和保存密码是另外一个话题,本文主要探讨服务器端(网站)是如何保存密码的。 下面首先介绍三种安全性较差(不推荐)的保存方法,然后介绍安全性较好(推荐)的保存方法。 安全性较差 1. 明文保存 最简单的处理方式就是不做处理,用户密码是什么就保存什么。 CSDN 事件中,官方声明泄露的数据是 2009 年的备份数据库。如果账号是在 2009 年之后注册的,那么就没有遭到泄露,而在那之前的则都泄露了。这就说明在 2009 年数据库备份之前,CSDN 的网站数据库中是把用户密码保存成明文的。 明文保存当然是最不安全的,尤其是很多人同一个密码会用在多个网站上。而类似 CSDN 这样泄露的数据就会被人利用做成社工库,比如 这个 和 这个 。 现在的数据库中绝对不应该保存明文密码! 2. 加密保存 如无特别说明,本文所指的加密都是指可逆加密,如 AES, RSA 等算法的加密方式。 有时候,为了某些特殊的原因,网站可能需要知道用户的明文密码。但是为了降低密码泄露的风险,会对密码做加密然后保存。在有需要的时候,再将保存的数据解密得到明文密码。 相对于明文保存,这种方法看起来更安全。但实际上,安全性并没有提高多少。因为,现在安全的中心在于保护加密密钥的安全,一旦加密方法和加密密钥泄露出去了,数据库中加密后的密码就和明文无异了,所以这种方法只不过是将安全性转移了而已,除了为达到某些特殊的目的之外,并没有多大用处。 根据网上公开的信息,很少看到有采用这种方法的。 3. 简单哈希保存 相比前两种而言,这种方式在安全性上有很大的提升。因为一般来说哈希是不可逆的,所以即便拿到了数据库中的数据,从哈希值倒推回明文密码的可能性也是很小的。但是这并不意味着绝对安全,因为有其它方式可以破解出明文密码来。 在实际的使用中,主要有两种不同的使用方法:只对明文密码做哈希;在明文密码上加 盐 ,再做哈希。很显然后一种方法的安全性较高。 哈希方法的专业称呼是 KDF: Key Derivation Function。下面根据哈希算法的不同,分别介绍。 3.1 MD5 在早期的网站设计中,由于 MD5 速度快,并且没有出现相应的攻击方法,因此应用最为广泛。然而,速度快是它的优点也是它的最大缺点。因为只需要构造一个表,把常见密码及其对应的 MD5 值保存下来,碰到 MD5 后的密码值,很容易查到原始的明文密码,尤其是在没有加盐或者盐比较简单的情况下。 现在已经有一些网站提供查找 MD5 对应的原始串的服务,比如 https://crackstation.net/ , http://md5decrypt.net/en/ , https://isc.sans.edu/tools/reversehash.html 等。它们的原理其实就是维护 彩虹表 。比如输入 7cbb3252ba6b7e9c422fac5334d22054 查询出来的原始串是 q1w2e3 ,这也是很常见的一个密码。

路由器配置 DDNS

路由器已经刷了 OpenWrt,接下来可能会用树莓派做一些事情,比如 NAS,还有很多没想好的。由于路由器每次启动拨号得到的 ip 地址不一样,运营商也可能会隔段时间给分配个新的 ip,所以需要配置 DDNS。 有个在 Namecheap 注册的域名,Namecheap 的文档还是比较不错的,比如有介绍 如何在 ddwrt 上配置 DDNS,还有 如何发送 http 请求实现 DDNS。 其实 OpenWrt 上就有 DDNS Client,并且有 UCI 配置界面。从 AA 12.09 版本开始就增加了对 Namecheap 的 DDNS 支持,所以可以直接使用 DDNS Client。按照 官方文档 给出的步骤一步步操作即可。 不过既然一条 HTTP 请求就能实现的功能,就没必要搞得这么复杂了,一个简单的脚本就能搞定。 #!/bin/sh Now=$(date +"%F %T") ip=`ifconfig pppoe-wan | grep inet | awk '{split($2,a,":");print a[2]}'` url="https://dynamicdns.park-your-domain.com/update?host=[HOST]&domain=[DOMAIN]&password=[DDNS_PASSWORD]&ip=$ip" curl "$url" > /dev/null 2>&1 if [ $? -eq 0 ]; then echo "[$Now] Success" else echo "[$Now] Fail" fi 其中,[HOST], [DOMAIN], [DDNS_PASSWORD] 是需要修改的地方,根据自己的实际情况做相应修改。比如,你有一个域名 example.

入手树莓派 Raspberry Pi 2 Model B

近期入手了 树莓派 2 Model B,配件加了16G Micro SD 卡、透明外壳和风扇。电源可以用安卓手机的充电器,或者用USB Hub 加上一根Micro USB 线。打算再从退役的笔记本上拆下硬盘来接上,搭建简易的家用 NAS。 如果比较熟悉 Linux 的相关操作,可以不用外接显示器、键盘、鼠标等。直接在 SD 卡中写入系统,插入树莓派,再给树莓派插上网线,连到路由器上,找到 ip,ssh 登录即可。如果不太熟悉的话,还是建议外接显示器来操作。 安装系统 这里 列举了树莓派能用的系统,我用的是 Raspbian。需要首先下载镜像 Raspbian Wheezy,然后根据文档将镜像解压并写入 SD 卡。比如对于 Windows 系统,按照官方文档步骤一步步操作即可。 将 SD 卡插入树莓派,给树莓派接上电源,用网线连接路由器,然后再路由器的管理界面查看树莓派的 ip,ssh 登录即可。Windows 下可以用 putty 或者 xshell,推荐xshell。如果用 xshell 的话,可能会报 找不到匹配的 outgoing encryption 算法 这个错,这时需要修改连接的属性,在 连接 -> SSH -> 安全性 配置页面,点击 加密 右边的 编辑 按钮,勾选上 aes192-ctr, aes128-ctr 和 aes-256-ctr 这几项,如下图所示。 登录用户名和密码分别是 pi 和 raspberry 。 系统配置 修改源 系统默认是使用 raspbian.