C#.NET 大型企业信息化系统 - 防黑客攻击 - SSO系统加固优化经验分享

   很久没写文章了,忽然间也不知道写什么好了同样,好多人可能觉得我死了,写个文章分享一下、证实一下本身还在,很好的活着吧,刷个存在感。java

   放弃了不少娱乐、休闲、旅游、写文章、看书、陪伴家人,静心默默的用了接近2年多的时间突破了本身在.NET领域的最重大的软件项目建设记录。全程经历了公司的核心业务系统从无到有,几十套系统被有序的建设起来投入生产、上百人的研发队伍建设起来、影响全国几十万人平常办公的庞大的核心信息系统建设完毕、顺利进入维护完善阶段了。web

   不少人说.NET的各类好与坏。其实实实在在的开发几套大型系统,多用一些.NET技术了,开发效率高、简单好用、用实际证实一下.NET并不差、只是看是谁开发出来的。每行代码都精益求精的编写的性能卓越、功能稳定、大型系统也能够用.NET实现的(固然不是100%,没有绝对、能作到相对就能够了、毕竟有些后台处理java也有优点、短短1-2年招聘上百个.NET熟练精通的开发人员也不容易,有时候只能是2个开发语言的都招聘、分工配合、优点互补)。redis

 

  最近遇到一个黑客、能把公司无线网络给劫持了、路由日志都能获取到了、SSL通信也能劫持,并且还获取了单点登陆的url,其实每一个公司的网络管理员也能够获得这些核心机密信息,如何增强安全性、防止严重的信息泄露?算法

  1:须要把单点登陆的机制修改一下,不在url里传递OpenId、这个是后台系统获取用户信息的核心参数。缓存

  2:受权码,url,只能消费一次,就是截获了url,第2次也没法使用、没法经过连接进入系统、知道了单点登陆的url也没大用。安全

  3:因为公司有几十套系统、几十万用户,这么多数据如何存储?如何保证系统的性能?高效?并且须要最少的服务器资源?毕竟也须要进行成本控制。服务器

   Redis 能够设置一个key值的过时时间,例如5分钟不用就自动过时,不须要额外进行处理了。一个受权码发出去后,其实就是立刻就会消费掉、考虑到系统卡、系统异常、系统复杂的状况,宽容一些,设置为5分钟不用就自动过时了,其实也能够设置为2-3分钟也问题不是很大,正常状况下通常是1-5秒内就消费掉了才正常。网络

   Redis 的访问效率高、由于几十万人在用的系统,高峰期并发量很是大、平时能够达到1万多人实时在线、须要能有高效的读取效率、飞快的处理速度。架构

   现有的底层的代码因为结构仍是很无缺、思路严谨,在这个基础上主要加了2个方法,一个是生成 AuthorizationCode 的方法,一个是消费 AuthorizationCode 的方法,而后提供一些对外的调用接口,固然为了提升安全性、还须要有签名验证码,防止数据中途被截取篡改。并发

   虽然有不多精力旺盛、无聊的人会干这样的事情、或者根本没碰见过这个样的人、可是只要遇到了,被破坏了,人家就说你系统不行、不安全、不稳健,太弱智、过低档次、架构不合理、能力不行、不好劲、没入门、门外汉、蛮干、糟烂系统。

 1         /// <summary>
 2         /// 获取登陆操做的验证码
 3         /// code做为换取access_token的票据,每次用户受权带上的code将不同,code只能使用一次,5分钟未被使用自动过时。 
 4         /// </summary>
 5         /// <param name="userInfo">用户信息</param>
 6         /// <returns>操做码</returns>
 7         public static BaseResult GetAuthorizationCode(BaseUserInfo userInfo)
 8         {
 9             BaseResult result = new BaseResult();
10             
11             if (ServiceUtil.VerifySignature(userInfo))
12             {
13                 // 产生一个受权码
14                 string authorizationCode = Guid.NewGuid().ToString("N");
15                 // 设置缓存服务器,消费一次,5分钟过时。
16                 using (var redisClient = PooledRedisHelper.GetTokenClient())
17                 {
18                     // 2016-03-03 吉日嘎拉 让缓存早点儿失效
19                     DateTime expiresAt = DateTime.Now.AddMinutes(5);
20                     string key = "code:" + authorizationCode;
21                     redisClient.Set(key, userInfo.OpenId, expiresAt);
22                 }
23                 result.ResultValue = authorizationCode;
24                 result.Status = true;
25                 result.StatusCode = Status.OK.ToString();
26                 result.StatusMessage = Status.OK.ToDescription();
27                 result.CreateSignature(userInfo);
28             }
29 
30             return result;
31         }

 

 1         /// <summary>
 2         /// 验证受权码
 3         /// 用掉一次后,必定要消费掉,确保只能用一次。
 4         /// </summary>
 5         /// <param name="userInfo">当前用户信息</param>
 6         /// <param name="code">受权码</param>
 7         /// <param name="openId">用户惟一识别码</param>
 8         /// <returns>验证成功</returns>
 9         public static bool VerifyAuthorizationCode(BaseUserInfo userInfo, string code, out string openId)
10         {
11             bool result = false;
12             openId = string.Empty;
13 
14             if (userInfo != null && !ServiceUtil.VerifySignature(userInfo))
15             {
16                 return result;
17             }
18 
19             using (var redisClient = PooledRedisHelper.GetTokenClient())
20             {
21                 // 2016-03-03 吉日嘎拉 让缓存早点儿失效
22                 string key = "code:" + code;
23                 openId = redisClient.Get<string>(key);
24                 if (!string.IsNullOrEmpty(openId))
25                 {
26                     result = true;
27                     if (userInfo != null && !string.IsNullOrEmpty(userInfo.OpenId))
28                     {
29                         result = userInfo.OpenId.Equals(openId);
30                     }
31                 }
32                 redisClient.Remove(key);
33             }
34 
35             return result;
36         }

   之前版本的OpenId,也是有过时时间,可是把过时时间定为为16个小时了,黑客拿到OpenId后,在16个小时内什么事情都干出来了,并且可能还会进入其余系统里去了,安全性不高。而后把思路调整了一下,OpenId只在内部系统之间通信用,外部通信用 AuthorizationCode [Code],5分钟就过时,并且还只能用一次。只能进入一个子系统,没法进入所有子系统。虽然在理论上也存在被黑客劫持的几率、可是这个安全性比16个小时、能消费无数这次的仍是安全不少不少、并且还能进入全部的系统的安全性比较下来,毛估估至少提升几十倍的安全性是有,从时间维度、可侵入的子系统范围上。

   其实这个功能2年前就想修改、一直精力不够或者没足够重视安全性、年纪大了精力也有些不够了,毕竟整整38岁了,一直还在一线打拼写写核心代码。完成一些核心功能。

   此次高度重视这个问题后,2天就代码写好了(功劳是前几天都睡足了),其实核心代码就是文章中的这几行代码。本身的系统被黑客攻克了或找出问题了,就得抓紧修改啊,不能有任何借口、立刻、马上、如今就修改过来

当系统没几我的用时,单点登陆怎么实现均可以、当系统天天有几十万人用时、就须要考虑:

1:须要多少的硬件设备?

2:须要消耗多少网络带宽?

3:须要多少存储设备?

4:算法须要的CPU计算量?

5:维护部署是否容易?

6:排查问题是否效率高?

7:子系统改造、衔接、难易程度如何?

8:安全程度如何?效率如何?

9:如何无缝的平稳过渡?

   千万不能有投机心理、侥幸心理,踏踏实实把每一个问题都处理好,优化好

   sso系统因为都是web的,没法post方式弹出一个网页、若能用post提交参数就安全多了、还能够加密、还能够传递不少参数,web的系统弹出页面都得是get方式的,欢迎在这方面有好思路的朋友门多沟通交流,本文章技术水平可能不够高深、本着分享的心态,写出来,欢迎你们留言,点评、Open的心态会让人提升很快、能够获得全行业人员的改进反馈。

   开心生活每一天,再坚持2年写代码,我就写代码到40岁了,天天提升一点点、天天多认识几个好朋友、人生路会愈来愈宽、但愿.NET的朋友圈愈来愈大吧。 

   写代码的大多 都是男人、看文章累了、休息一下眼睛,夏天了看看妹子吧,而后鼓足精神好好工做吧。

相关文章
相关标签/搜索