2016年8月

用户登录过程中密码传输的安全分析

密码,属于个人机密。最好除本人以外,不让任何人知道。

对于某个网络应用的密码,需要保存到服务提供方的服务器,因此必须加密。最好采用不可逆加密,以确保服务提供方也无法知道原始密码。另外一方面也是为了防止拖库(数据库整体泄露)。所以服务端保存的密码,一般是对原始密码进行哈希处理的结果。

分析

密码在传输过程中要加密

一般网络攻击的入口有三处:客户端、传输过程、服务端。本文主要是分析用户登录的数据在传输过程中被攻击的情况。这也是黑客最容易下手的地方。现在连接网络基本都通过 wifi 的方式,最常见的是电脑或者手机连接到陌生的网络(公共 wifi)。那么 wifi 提供方轻而易举就可以监听到用户所有的网络请求,主要是实施抓包和重放攻击(Replay Attacks)。

所以密码在传输过程中也需要加密,这就解决了明文密码在传输过程中被泄露的问题。

请求参数一次有效

重放攻击又叫重播攻击、回放攻击,意思是将用户发送的有效请求再发送一次,以欺骗服务器。(如取得登录凭据。)解决办法是确保请求参数使用过一次即失效,使得重发请求失效。

解决方案

1. 不使用 https 协议的情况

通过随机识别码来防止重放攻击。在进行登录请求前,先请求获得一个随机识别码(request_code),在服务端确保产生一个在有效期内唯一的随机识别码,随机识别码在服务端过期时间设置为 1 分钟。

登录请求的参数中增加随机识别码参数,密码使用 md5 加密。然后对参数进行签名,签名算法事先约定好。签名是为了防止参数被修改。那么登录请求的参数如下:

/api/login/?username=zhangsan&password=md5(pwd)&request_code=4321&sign=xxxxxxxxxx

加密与签名建议使用 RSA 算法。

也可以将每个请求的 body 进行加密,使用对称加密算法。在客户端启动或者初始化时,向服务端请求获取对称加密算法的密钥,该密钥是经过 RSA 加密的,使用时解密出该密钥。(当然,对称密钥要足够复杂。否则,黑客将跳过 RSA 直接攻击对称加密部分。)

2. 使用 https 协议

由于 https 本身已经具有加密和防重放攻击的功能,所以购买证书部署好即可。但是 https 仍然有可能被攻破解,所以在上面的方案基础上增加 https 协议,是最为稳妥的方案。

注:对于浏览器,也可以通过 js 实现 md5 等哈希算法以及 RSA 加解密。