两分钟实现安全完备的登陆模块

引言

2016年中,我所在的项目组将原来系统中的登陆模块拆出来作成一套集中帐号管理系统,并对外提供单点登陆的服务。后来,公司中须要使用员工帐号进行登陆的系统愈来愈多,但这些系统都是各有各的实现方式,管理比较混乱。为了推广咱们组的帐号管理系统,统一公司的帐号体系,我写了一篇“软文”但愿在公司技术月刊上发表,即是这篇文章的来历。html

随着公司业务的不断发展,各类内部管理系统也愈来愈多,这些系统虽然功能职责各不相同,但有一个功能模块是全部这些系统都必备的,那就是登陆模块。登陆模块负责生成并存储识别用户身份的数据,在有用户对系统进行操做的时候验明用户的真实身份,并进行适当的权限限制。算法

如何实现登陆模块

要实现一个基础的登陆模块很是简单,大概有下面几个步骤:数据库

 

  1. 实现用户注册页面,用户填写包括用户名密码的基本信息以后,将用户信息存储到数据库。
  2. 用户尝试对系统进行操做前,判断用户是否登陆,若是没有就跳转到登陆页面让用户输入用户名密码。
  3. 用户输入正确的用户名密码以后,验明用户身份并生成 session 和 cookie,以便在用户作下一次操做时判断用户的身份和权限。


完成上述三个步骤,一个基本的用户登陆模块就完成了。可是,凡事总有可是,事情并无这么简单。在一个真实的场景中,做为系统信息安全的重要保障,登陆模块每每还须要考虑不少的实现细节。浏览器

  1. 弱口令限制安全

    不少用户在注册的时候,喜欢使用很是简单的密码,好比 123456 或者 qweasd 之类的。尤为在企业内部系统中,这种用户密码更是常见。可是,这类密码简直形同虚设,如此简单的用户密码,很是容易被恶意用户猜解,从而致使信息的泄露,对企业信息安全形成严重威胁。为了不这种状况的发生,咱们在新用户注册或用户重设密码的时候,每每会对用户密码复杂度作出必定的限制,好比要求用户密码必须同时包含数字、大写字母、小写字母、特殊符号四类字符中的至少三类,且密码位数不能低于8位。服务器

  2. 注册验证微信

    做为一个企业内部系统,咱们每每不但愿企业外部人员也可以注册成为用户,由于这极可能会致使企业内部信息的泄露。那么,如何保证外部人员没法注册呢?常见的手段是使用企业邮箱对注册人的身份进行验证。好比,用户在注册时,除了要用户输入用户名和密码之外,还须要用户输入其企业邮箱帐号。用户提交注册表单后,系统验证其输入的邮箱帐号是企业内部的合法邮箱帐号,并向这个邮箱发一封注册验证邮件,其内包含一个随机生成的复杂连接,用户点击这个连接以后,才能彻底注册成功。cookie

  3. 加密存储密码网络

    用户注册成功以后,系统须要将用户名和密码的相关信息写入数据库或相似介质,以便用户下次登陆系统时查询验证。但是为了防备一些很是规的状况,咱们每每不能直接明文存储用户的密码,而是用摘要算法对用户密码进行若干处理,再将摘要信息写入数据库中。好比,用户的原始密码是 hell0W0rld ,咱们先用 MD5 算法对密码作摘要,获得摘要密文 17529cb075a386f08409f260bf0dfb8c ,而后再用用户的注册时间戳做为 salt 拼接到密文上,获得 17529cb075a386f08409f260bf0dfb8c1484547629852 ,再对这个字符串用 MD5 算法作摘要,获得密码摘要信息 6ee203a6a6c05a6f8f958c5be00b1313 ,最后咱们将用户名、密码摘要信息、用户注册时间戳三个信息所有写入数据库中,以便未来验证用户身份。session

    这样的作法虽然看起来比较繁琐,但其安全性获得了比较高的保障。即便数据库中的密码信息被彻底盗取,且用户的原始密码相对简单,面对加了随机salt且作过两次摘要的密码信息,想要猜解出原始密码也是很是困难的

  4. 验证码

    暴力猜解是比较常见的用户信息猜解手段,简单点说,就是用程序反复尝试用不一样的密码登陆某个帐户,直到成功为止。这种破解用户密码的方式,一方面增长了用户信息泄露的风险,另外一方面也因为系统须要不断的查询数据库验证密码正确性,而大大增长了系统的资源消耗。为了防止这种状况,通常咱们须要经过随机图片验证码来验证当前提交登陆请求的是人而不是某种程序。而通常为了平衡用户体验和系统安全性两方面的要求,常见的作法是用户输错密码3次后再要求用户输入验证码。

  5. 失败次数

    虽然咱们加了图片验证码提升系统的安全性,但仍是有一些比较高级的破解程序,能够正确识别出图片验证码的内容。因此,咱们还须要加上尝试失败次数的限制,当用户尝试登陆失败超过指定的次数以后,系统就会锁定该帐号。一段时间内,不管用户是否输入正确的用户密码,系统都拒绝该帐号的登陆请求,必须找系统管理员手段解锁,或等待一段时间以后才能再次尝试。

  6. 找回密码

    找回密码也是很常见的需求点。用户有时候真的会忘记本身的密码,这时,须要用户可以手动重置本身的密码。常见的作法是用户提交重置密码请求,系统向该用户的注册邮箱发一封密码重置邮件,内含一个随机生成的复杂连接,用户经过这个连接地址访问系统的密码重置页面来重置本身的密码。

  7. HTTPS

    用户在发起登陆请求时,输入的帐号和密码信息经过网络发往服务器,这些信息在发往服务器的过程当中会经历很是多的网络节点,若是信息在传输过程当中是明文状态,那么这些网络节点就均可以获取到用户的帐号和密码信息,这将成为很是大的系统信息安全隐患。所以,对用户登陆过程当中的敏感信息进行加密传输是很是必要的。最多见的作法就是对登陆请求用 HTTPS 协议代替 HTTP 协议。

  8. 跨平台特性

    不少的系统都具备跨平台特性,好比 OA 系统,咱们能够在 PC 上填写加班申请单,在手机浏览器上查看这个申请单的审批状态,而若是公司员工是在微信中访问 OA 系统的页面,OA 系统还会经过关联的微信帐号让用户直接登陆系统,免去了输入用户名密码的步骤,从而大大提升了用户操做的便利性。

由此咱们能够看出,要实现一个功能完备又安全的登陆模块,并非一件很是简单的事情,这其中设计、开发、测试的工做都须要花费大量的时间和人力,那么咱们又怎么能在两分钟内为各应用系统实现这么多复杂的功能呢?答案就是使用 UserCenter。

如何使用 UserCenter

UserCenter 是 OA 组根据公司实际业务场景设计实现的单点登陆系统,功能完善,可靠性高,使用方便。

使用 UserCenter 只需简单的两个步骤:

  1. 安装 UserCenter SDK

    UserCenter 经过 Composer 包分发其 SDK,只要在项目的 Composer 配置中声明依赖 UserCenter 就能够了。

  2. 修改 Controller 基类的 _initialize 方法,调用 UserCenter 的接口

    复制上面的代码到 Controller 基类中,修改第 4 行和第 15 行的代码便可。

UserCenter 的其余优点

UserCenter 系统不只功能完备安全性高,可靠性也值得信赖。目前系统采用主从备份部署方式,武汉和深圳机房各有一套服务处于运行状态。员工帐号数据可以实时在主从服务间进行同步,一旦主服务因网络或电力故障没法访问,系统会将登陆和身份验证的相关网络请求切换到备用服务上,使得各应用系统的用户登陆功能不受影响。

同时,UserCenter 还支持各类第三方系统经过 LDAP 接口接入,如公司正在使用 PMS、WIKI 以及 JENKINS 系统等等。

另外,使用 UserCenter 以后,公司各内部系统共用同一套帐号系统,在新员工入职和老员工离职时,帐号的建立和回收工做都将更加便利和安全。同时,因为使用 UserCenter 的各个应用系统再也不须要单独保存用户的帐号和密码信息,使得公司员工帐号泄露的风险大大下降。

结语

目前,公司尚未统一的的身份验证策略和框架。随着业务的增加和时间的推移,这将致使大量内部系统都拥有一套本身的身份验证模块和用户帐号数据。每一个员工都须要记住多个用户名和密码,才能访问各个不一样的系统。这给系统管理人员以及公司的各个员工都带来很大的负担。若是没有统一的策略,开发人员就须要为每一个系统重复实现定制的登陆模块,这还会致使各类维护上的麻烦问题。UserCenter 为安全性和身份验证提供了统一的范式,大大减轻了用户、管理员和开发人员的负担。

 

如需转载,请注明转自:http://www.cnblogs.com/silenttiger/p/6296315.html

 

欢迎关注个人微信公众号:老虎的小窝
微信公众号 老虎的小窝

相关文章
相关标签/搜索