继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

安全登录理应是什么样子

骑白马的菜鸟
关注TA
已关注
手记 3
粉丝 2
获赞 47

摘要:相信使用过互联网应用或是系统的人不会陌生,有一个功能模块是所有这些应用或是系统都必不可少的,那就是登录模块。登录模块负责生成、存储并验证用户身份的数据,在用户对系统进行操作的时候验明用户的真实身份,并进行权限控制。

如何实现登录模块

要完成一个最基础的登录模块自然简单,请看业务流程图:

https://img.mukewang.com/5b0629df0001ee6105080481.jpg

  1. 如果未注册账号,则需要先进行账号注册,注册成功后将用户信息存储到数据库,并且注册成功后再登录。

  2. 用户尝试对系统进行操作前,判断用户是否登录。

  3. 如果已经登录,继续后面的业务,否则,跳转到登录页面引导登录。

  4. 如果验证通过后,生成 session 和 cookie存入本地,以便在用户做下一次操作时判断用户的身份和权限,否则继续登录。

如此,一个最基本的用户登录模块就实现了。

安全登录理应是什么样子

在真实的应用场景中,登录模块作为系统安全重要控制入口,往往还需要考虑更多细节。

  1. 密码复杂度

    很多用户图省事,常使用非常简单的密码,比如 键盘连续(123456 或者 qweasd ),纯数字、纯英文之类的。特别在企业自己内部使用的系统里,这样的密码非常多,恶意用户很容易猜解这类密码,这给系统安全造成遭打威胁。为了防止这种事情的发生,我们在新用户注册或用户重设密码的时候,就需要配备密码复杂度检查功能,比如要求用户密码不得包含三个或三个以上来自帐号中的字符,必须同时包含特殊符号、大写字母、小写字母、数字四类字符中的至少三类,且密码总长度不能低于8位

  2. 过期冻结账号

    提示用户定期修改密码,当用户账号超过一定时间未修改,再次登录时就要冻结该账号。因为可能你的密码已经泄露了,人家一直在使用你的账号,你却不知道。定期修改密码,可以降低因为泄露带来的风险,这也是为什么很多系统都会强调要定期修改密码的原因,像苹果公司就是这么干的。

  3. 加密存储密码

    密码不要明文保存到数据库,CSDN当年使用明文存储密码导致用户密码被完全暴露,这个事件影响十分严重。所以造成不要使用明文存储密码,要使用像MD5之类的散列算法加密存储。

    可是为了防备一些非常规的情况,不能只是简单对用户密码MD5直接加密,因为像CMD5这种网站可以反向解密很多简单密码的MD5密文。

    https://img3.mukewang.com/5b0629f300012bb410420243.jpg

    所以我们还要做些升级处理,比如加密之前密码同时还要加上一个不固定的salt值一起拼接加密,一般md5(md5(password+userid) + salt)就可以了,这个salt是盐,一起加密增加密码的长度也增加了破解的难度,盐一般设计为64位随机生成的字符串,最好分开存放,假如用户信息库被攻击了黑客也拿不到盐的库。最后我们将salt、userid、密码摘要信息三个信息全部写入数据库中,以便将来验证用户身份。这样的做法虽然看起来比较繁琐,但其安全性得到了比较高的保障。即使数据库中的密码信息被完全盗取,且用户的原始密码相对简单,面对加了随机salt且做过两次摘要的密码信息,想要猜解出原始密码也是非常困难的。

  4. 多因子验证

    暴力猜解是比较常见的用户信息猜解手段,简单点说,就是用程序反复尝试用不同的密码登录某个账户,直到成功为止。这种破解用户密码的方式,一方面增加了用户信息泄露的风险,另一方面也由于系统需要不断的查询数据库验证密码正确性,更为严重的是增加了系统的资源消耗。为了防止这种情况出现,一般我们需要通过随机图片验证码或者手机短信来验证当前提交登录请求的是人而不是某种程序。

  5. 失败次数限制

    虽然我们加了图片验证码提高系统的安全性,但还是有一些比较高级的破解程序,可以正确识别出图片验证码的内容。当然可以更高级的图形验证码,比如像12306网站购票的验证码一经出现,不仅降低了黄牛及刷票软件刷票的难度,同时也增加了用户购票的难度。但,凡事总有但是,道高一尺魔高一丈,这种图形验证码相信一定时间之后,又能更快地被程序自动破解。所以,我们还需要加上尝试失败次数的限制,当用户尝试登录失败超过指定的次数之后,系统就冻结该账号。之后必须找系统管理员进行手动解锁,或等待一段时间之后才能再次尝试登录。

  6. https加密

     SSL证书让网站实现加密传输,这样即使在传输过程被恶意用户截取,也不能发起攻击

     7. 密码找回

               通过手机或者是邮箱找回密码应该是比较安全快速的,这也是为什么很多大型网站都用的手机找回密码,当然手机找不回的时候提供人工申诉入口也是很有必要的。

     8.防sql注入

    前端输入时,就要禁止用户输入导致sql注入的字符,比如密码设置包含insert字符,就提示不合规,防止注入带来安全漏洞

     9.过期时间

              比如设置验证码过期时间,2分钟没有输入就自动过期;

             设置会话过期时间,比如登录10分钟后不操作就失效,提示需重新登录;

        设置不让浏览器记住密码

     10.其他

    有必要的话就实现单点登录,如果允许强制登录要给用户安全提醒

             

安全登录业务流程图

https://img2.mukewang.com/5b062a020001356707811722.jpg

 

GitHub

根据上面提到的点,笔者已经做成一个单独Demo放到github了,各位有兴趣的可以到我的GitHub上下载查看,github地址如下:https://github.com/zishenghhh/SecurityLoginDemo,部署说明请看:https://github.com/zishenghhh/SecurityLoginDemo/wiki

 

学习本就是一个不断模仿、练习、再到最后面自己原创的过程。

虽然可能从来不能写出超越网上通类型同主题博文,但为什么还是要写?
于自己而言,博文主要是自己总结。假设自己有观众,毕竟讲是最好的学(见下图)。

于读者而言,笔者能在这个过程get到知识点,那就是双赢了。
当然由于笔者能力有限,或许文中存在描述不正确,欢迎指正、补充!
感谢您的阅读。如果本文对您有用,那么请点赞鼓励。

https://img3.mukewang.com/5b062a3b000117dd06510374.jpg

  

 


打开App,阅读手记
6人推荐
发表评论
随时随地看视频慕课网APP

热门评论

支持,支持


mk

查看全部评论