开源软件登录认证问题
很多应用需要客户首先进行注册,然后使用用户名、密码进行验证,之前在为一个分布式系统添加认证模块的时候,遇到一个问题,这里进行简要的分析。
认证的两种主要形式:
1. 单机登录认证:如windows、linux系统用户登录,这种应用的程序代码通常是不公开的,用户要正常的使用系统,必须越过这一障碍。
2. 网络登录认证:如QQ、飞信等聊天软件的用户登录,这种应用的代码可以是开源的,因为即使即使代码开源,hacker去掉了客户认证的代码,重新编译运行,服务器发现记录客户端的登录状态为未登录,客户端还是不能继续工作。
项目中遇到的问题:
客户端通过挂载后,像使用本地文件系统一样使用远程文件系统。登录认证在挂载的时候进行,用户名密码必须是服务器linux系统上的用户,服务器为每个用户建立单独的用户文件夹存储用户数据。
在简单的添加了认证过程后,客户端必须通过认证才能正常使用系统,以后客户端的请求数据中都包含了用户名信息。但由于登录模块是硬加到挂载过程中的,而且系统是开源的,如果hacker在使用前,在客户端代码中将认证的代码去掉,是可以直接使用文件系统的。解决的方法是:类似于常用的网络应用,在服务器端记录用户的登录状态,此时hacker即使去掉登录的代码,仍不能正常使用系统,因为服务器端的状态标识其未登录。
这样做仍然存在问题,客户端每次请求都包含用户名,服务器只是检测该用户是否已经登录,如果hacker去掉登录代码并伪造自己的身份,修改请求中的数据,如果该用户恰好为已经登录的用户,hacker还是有机可趁。解决该问题的方法:客户在登录成功后,服务器为其生成一个随机通信码,以后客户端的请求中将包含用户名与对应的随机通信码,服务器只有检测到用户名与随机通信码都匹配时才相应客户端的请求。