上述简易的登录验证策略存在明显的安全漏洞,需要优化。
1.1.1 密码的传输
客户端第一次发出登录请求时, 用户密码以明文的方式传输, 一旦被截获, 后果严重。因此密码需要加密,例如可采用RSA非对称加密。具体流程如下:
-
客户端向服务器第一次发起登录请求(不传输用户名和密码)。
-
服务器利用RSA算法产生一对公钥和私钥。并保留私钥, 将公钥发送给客户端。
-
客户端收到公钥后, 加密用户密码, 向服务器发起第二次登录请求(传输用户名和加密后的密码)。
-
服务器利用保留的私钥对密文进行解密,得到真正的密码。
1.1.2 登录状态token
再仔细核对上述登录流程, 我们发现服务器判断用户是否登录, 完全依赖于sessionId, 一旦其被截获, 黑客就能够模拟出用户的请求。于是我们需要引入token的概念: 用户登录成功后, 服务器不但为其分配了sessionId, 还分配了token, token是维持登录状态的关键秘密数据。在服务器向客户端发送的token数据,也需要加密。于是一次登录的细节再次扩展。
-
客户端向服务器第一次发起登录请求(不传输用户名和密码)。
-
服务器利用RSA算法产生一对公钥和私钥。并保留私钥, 将公钥发送给客户端。
-
客户端收到公钥后, 加密用户密码,向服务器发送用户名和加密后的用户密码; 同时另外产生一对公钥和私钥,自己保留私钥, 向服务器发送公钥; 于是第二次登