一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Asp.net

用RSA加密实现Web登录密码加密传输

通常我们做一个Web应用程序的时候都需要登录,登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等场合。 这里顺带一个小插曲,我以前有家公司,办公室装修时候安排的网口相对较少,不太够用,于是我和另外一个同事使用了一个hub来共享一个网口,这就导致了很有趣的现象:任何他的网络包我都能抓得到,当然了,我的他也能抓得到。这是不是有很大的安全隐患了?我有可能在不经意间会泄漏自己的密码。 所以,很多安全要求较高的网站都不会明文传输密码,它们会使用https来确保传输过程的安全,https是用证书来实现的,证书来自于证书颁发机构,当然了,你也可以自己造一张证书,但这样别人访问你的网站的时候还是会遇到麻烦,因为你自己造的证书不在用户浏览器的信任范围之内,你还得在用户浏览器上安装你的证书,来让用户浏览器相信你的网站,很多用户并不知道如何操作,就算会操作,也能也不乐意干;另一种选择是你向权威证书颁发机构申请一张证书,但这样有一定的门槛,还需要付费,也不是我们乐意干的事。 所以,我打算自己实现一个密码加密传输方法。 这里使用了RSA非对称加密算法,对称加密也许大家都已经很熟悉,也就是加密和解密用的都是同样的密钥,没有密钥,就无法解密,这是对称加密。而非对称加密算法中,加密所用的密钥和解密所用的密钥是不相同的:你使用我的公钥加密,我使用我的私钥来解密;如果你不使用我的公钥加密,那我无法解密;如果我没有私钥,我也没法解密。 我设计的这个登录密码加密传输方法的原理图如下:   首先,先演练一下非对称加密:

大家可以清楚看到,密码被加密成128字节长度的密文,为什么是固定128字节呢?这是因为我们的RSACryptoServiceProvider默认生成的key的长度是1024,即1024位的加密,所以不管你要加密的密码有多长,它生成的密文的长度肯定是128字节,也因为这样,密码的长度是有限制的,1024位的RSA算法,只能加密大约100个字节长度的明文,要提高可加密的明文的长度限制,就得增加key的长度,比如把key改到2048位,这样能加密的明文的长度限制也就变为大概200出头这样……还是太少啊!而且这样会带来加密速度的显著下降,RSA本来就很慢……是的,比同没有长度限制的对称加密,这种非对称加密的限制可真多,即便是200个字符,又能传输什么东西呢?——密码!这个就够了,传输完密码之后,我们就使用对称加密,所以,RSA往往是用来“协商”一个对称加密的key的。 接下去,真正的难点在于用javascript实现一个和.net的RSA兼容的算法。密码学,对我来说真像天书一般,每次我一看就头大,这个工作是没办法自己做的了,只能到网上找,那是相当的费力啊,找到许多js的RSA实现,但都和.net的这套东西不兼容,最后还是功夫不负有心人,终于找到了一套。不多说,上代码:

这是客户端代码,大家可以看到,基本没有什么服务器端代码,<%=postbackUserName%>用于回显输入的用户名,<%=LoginResult%>用于显示登录结果,<%=strPublicKeyExponent%>和<%=strPublicKeyModulus%>则用来告诉客户端RSA公钥。需要的javascript文件说明: jQuery.md5.js –  用于对密码进行两次md5加密;(我通常在数据库中保存的用户密码是两次MD5后的结果) BigInt.js – 用于生成一个大整型;(这是RSA算法的需要) RSA.js – RSA的主要算法; Barrett.js – RSA算法所需要用到的一个支持文件; 对于密码学,我几乎一无所知,所以没办法跟大家解释清楚RSA算法的原理,抱歉,我只知道怎么用。关于javascript中这行代码:“setMaxDigits(129);”具体表示什么我也不清楚,我只知道,把参数改为小于129的数之后会导致客户端的javascript执行进入死循环。服务器端代码也很简单:

用户名“user1” 密码“123456” 登录成功! 抓取http报文看看POST的“密码”: 这样的“密码”的破解就成为了理论上的可行了。:) 下面提供完整代码下载(使用VS2010开发环境):RSALoginTest 我根据博主的例子整理的:RsaDemo   from:http://www.cnblogs.com/AloneSword/archive/2013/09/18/3329359.html

龙生   18 Apr 2015
View Details

System.Security.Cryptography 命名空间

System.Security.Cryptography 命名空间提供加密服务,包括安全的数据编码和解码,以及许多其他操作,例如散列法、随机数字生成和消息身份验证。 有关更多信息,请参见加密服务。 类 类 说明 Aes 表示高级加密标准 (AES) 的所有实现都必须从中继承的抽象基类。 AesCryptoServiceProvider 使用高级加密标准 (AES) 算法的加密应用程序编程接口 (CAPI) 实现来执行对称加密和解密。 AesManaged 提供高级加密标准 (AES) 对称算法的托管实现。 AsnEncodedData 表示 Abstract Syntax Notation One (ASN.1) 编码数据。 AsnEncodedDataCollection 表示 AsnEncodedData 对象的集合。 此类不能被继承。 AsnEncodedDataEnumerator 提供在 AsnEncodedDataCollection 对象中导航的能力。 此类不能被继承。 AsymmetricAlgorithm 表示所有非对称算法的实现都必须从中继承的抽象基类。 AsymmetricKeyExchangeDeformatter 表示所有非对称密钥交换反格式化程序均从中派生的基类。 AsymmetricKeyExchangeFormatter 表示所有非对称密钥交换格式化程序均从中派生的基类。 AsymmetricSignatureDeformatter 表示所有不对称签名反格式化程序实现均从中派生的抽象基类。 AsymmetricSignatureFormatter 表示所有不对称签名格式化程序实现均从中派生的基类。 CngAlgorithm 封装加密算法的名称。 CngAlgorithmGroup 封装加密算法组的名称。 CngKey 定义与下一代加密技术 (CNG) 对象一起使用的密钥的核心功能。 CngKeyBlobFormat 指定与 Microsoft 下一代加密技术 (CNG) 对象一起使用的密钥 BLOB 格式。 CngKeyCreationParameters 包含密钥创建的高级属性。 CngPropertyCollection 提供下一代加密技术 (CNG) 属性的强类型集合。 CngProvider 封装与下一代加密技术 (CNG) 对象一起使用的密钥存储提供程序 (KSP) 的名称。 CngUIPolicy 为用户界面 (UI) 封装可选配置参数,当您访问受保护的密钥时,下一代加密技术 (CNG) 将显示这些配置参数。 CryptoAPITransform 执行数据的加密转换。 此类不能被继承。 CryptoConfig 访问加密配置信息。 CryptographicAttributeObject […]

龙生   18 Apr 2015
View Details

.NET技术+25台服务器怎样支撑世界第54大网站

英文原文:StackOverflow Update: 560M Pageviews A Month, 25 Servers, And It’s All About Performance StackOverflow 是一个 IT 技术问答网站,用户可以在网站上提交和回答问题。当下的 StackOverflow 已拥有 400 万个用户,4000 万个回答,月 PV5.6 亿,世界排行第 54。然而值得关注的是,支撑他们网站的全部服务器只有 25 台,并且都保持着非常低的资源使用率,这是一场高有效性、负载均衡、缓存、数据库、搜索及高效代码上的较量。近日,High Scalability 创始人 Todd Hoff 根据 Marco Cecconi 的演讲视频“ The architecture of StackOverflow”以及 Nick Craver 的博文“ What it takes to run Stack Overflow”总结了 StackOverflow 的成功原因。 意料之中,也是意料之外,Stack Overflow 仍然重度使用着微软的产品。他们认为既然微软的基础设施可以满足需求,又足够便宜,那么没有什么理由去做根本上的改变。而在需要的地方,他们同样使用了 Linux。究其根本,一切都是为了性能。 另一个值得关注的地方是,Stack Overflow 仍然使用着纵向扩展策略,没有使用云。他们使用了 384GB 的内存和 2TB 的 SSD 来支撑 SQL Servers,如果使用 AWS 的话,花费可想而知。没有使用云的另一个原因是 Stack Overflow 认为云会一定程度上的降低性能,同时也会给优化和排查系统问题增加难度。此外,他们的架构也并不需要横向扩展。峰值期间是横向扩展的杀手级应用场景,然而他们有着丰富的系统调整经验去应对。该公司仍然坚持着 Jeff Atwood 的名言——硬件永远比程序员便宜。 Marco Ceccon 曾提到,在谈及系统时,有一件事情必须首先弄明白——需要解决问题的类型。首先,从简单方面着手,StackExchange 究竟是用来做什么的——首先是一些主题,然后围绕这些主题建立社区,最后就形成了这个令人敬佩的问答网站。 其次则是规模相关。StackExchange 在飞速增长,需要处理大量的数据传输,那么这些都是如何完成的,特别是只使用了 25 台服务器,下面一起追根揭底: 状态 StackExchange 拥有 110 个站点,以每个月 3 […]

龙生   15 Apr 2015
View Details

NuGet学习笔记(2)——使用图形化界面打包自己的类库

上文NuGet学习笔记(1) 初识NuGet及快速安装使用说到NuGet相对于我们最重要的功能是能够搭建自己的NuGet服务器,实现公司内部类库的轻松共享更新。在安装好NuGet扩展后,我们已经能够通过NuGet轻松下载自己需要的类库,下面来说一说如何将自己的项目类库进行打包发布 使用图形界面打包自己的类库 NuGet可以使用NuGet.exe在命令行下进行类库打包,也可以使用图形化界面进行打包,估计很多朋友都和我一样对不熟悉的命令行有些感冒,所以在此仅讲述下使用图形化界面进行类库打包 1. 首先下载 包包管理器 NuGetPackageExplorer,顾名思义,包包管理器可以用来创建新的类库包,也可以浏览已经创建好的类库包 2. 下载完成后,双击 NuGetPackageExplorer.application 进行安装,安装完成后会在桌面上生成一个NuGet Package Explorer 的快捷方式 3. 双击NuGet Package Explorer出现启动界面,选择Create a new package(Ctrl+N)创建一个新包 4. 选择菜单 Edit > Edit Package Metadata (或者 CTRL + K) 编辑包包信息 这里可以编辑类库包的信息和添加类库、程序集的引用解释下几个比较重要的字段 Id:用于定位类库包的唯一标示,如在命令行下执行 Install-Package MyPackage 这里的MyPackage就是包包的Id值 Version:类库的版本号,这里建议和程序集的真实版本号保持一致,以免发生混淆 Dependencies:此类库依赖的程序集,根据实际情况添加依赖类库的Id和版本号,若无留空即可,这里需要注意下填写的依赖类库需要在NuGet服务器上能找到,否则无法完成自动引用添加 Framework assemblies:依赖的Framework 程序集,根据实际需要选择即可,一般无需设置 除以上四项以外其他属性根据实际情况修改即可,若自己用不修改也中,不过为了使用方便还是建议把类库描述(Description)填写下 5. 编辑好包包信息后接下来添加DLL到包包中 可以选择 右键-->Add Existinng File… 选择dll添加,也可以直接拖拽DLL到 Package contents 窗口,此例选择拖拽方式 直接拖拽dll到窗口后,会出现提示:是否将 Winista.HtmlParser.dll放到lib 文件夹下,一般我们选择是 6. DLL添加完成后,快捷键Ctrl + K 修改包包信息Id为Winista.HtmlParser,版本号为1.8.0 7. 信息修改和dll都添加完毕后,选择File --> Save(或Ctrl + S)将文件进行保存,默认文件名为Id + 版本号.nupkg 8. 完成保存后如需要发布到网上,选择File--> Publish…(或Ctrl + P) 默认的发布地址是官网,发布 Key需要到官网去注册一个账号,然后就可以得到,这里不在复述,若无需发布直接关闭即可 ps:这里没有讲述如何打包项目文件,一般情况下我们自己将项目文件编译成DLL然后使用图形化界面打包即可满足需求,若实际工作需要高度集成完全自动化操作可自行去研究下官方文档http://docs.nuget.org/ 添加DLL默认会添加Lib文件夹,额外的菜单上还有很多.net文件夹,src等文件夹,这些文件夹只是对文件上的一个物理上的划分而已,只是为了帮助我们做好文件分类,没有其他的用途,dll文件可以随便放置,不过为了规范还是建议按照通常习惯来放置。   from:http://kb.cnblogs.com/page/143191/

龙生   15 Apr 2015
View Details

There is no build provider registered for the extension '.html'. You can register one in the section in machine.config or web.config. Make sure is has a BuildProviderAppliesToAttribute attribute which includes the value 'Web' or 'All'.

我的站,是使用UrlRewriter将.html重写为.aspx,即访问.html 实际访问的是.aspx ,但实际存在的.html文件,却出现“There is no build provider registered for the extension '.html'. You can register one in the <compilation><buildProviders> section in machine.config or web.config. Make sure is has a BuildProviderAppliesToAttribute attribute which includes the value 'Web' or 'All'.‘的错误 百度,发现介绍解决方案差不多跟这个地址 http://hi.baidu.com/xiaoyaosr/item/351f2f3ce3b48223b3c0c52e  提供的方法一样。 但是,我按此方法来做,却出现错误,原来的重写还能写,现在地却也用不了了,错误如图 web.config文件配置如图 from:http://bbs.csdn.net/topics/390823510

龙生   15 Apr 2015
View Details

NuGet学习笔记(1)——初识NuGet及快速安装使用

关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学习NuGet一个记录。 初次认识NuGet是在去年把项目升级为MVC3的时候,当时看到工具菜单多一项Library Package Manager,右键项目文件多了一项Manage Nuget Packages…,这是个神马玩意儿,当时是一头雾水,后台查了些资料才知到NuGet是 Visual Studio的一个扩展,引用dudu的话来说就是管理程序的包包,可以参考msdn上这篇文章使用 NuGet 管理项目库以及咱们博客园站长dudu写的程序员,用NuGet管理好你的类库,有些类似java中常用的maven 为什么要使用NuGet 简单的说NuGet可以是我们的工作更方便,当我们的项目里要引用到的一些库时候,比如JQuery、Newtonsoft.Json、log4net等,我们需要从网上下载这些库,然后依次拷贝到各个项目中,当有的类库有更新时又不得不再重复一遍很是繁琐 ,这时就可以考虑使用NuGet来帮我们管理和更新这些类库,而且更新类库时会自动添加类库的相关引用,方便至极。当然网上一些我们常用的类库更新频率不是很高而且即便出了新版本我们也没必要总是保持最新,故这点对我们的帮助比较有限,个人认为NuGet最大的好处在于可以搭建自己的类库服务器,想想一下吧,在一些较大些的公司里面有很多的项目,然后其中有一些是整个组,甚至整个公司通用的类库,当这些类库有更新后我们需要依次拷贝到我们的项目,甚至于有时候我们自己都搞不清楚各个项目里的版本是否一致,有时偶尔一两个项目忘了复制更新出现莫名其妙的错误,为此头疼不已,现在有了NuGet,世界从此而不同。 安装NuGet扩展 要使用NuGet首先需要安装它(在安装了MVC3的系统上已自动安装了NuGet) 1. 点击 工具-->扩展管理器(R)…-->右上角搜索框输入NuGet 2. 点击 NuGetPackage Manager 项上面的下载按钮开始下载NuGet 3. 下载完成后出现安装页面,点安装开始安装 4. 很快安装完成,然后点击关闭完成整个安装 5. 安装完后NuGet暂时不能用,需要重新启动下VS才行,重启后完毕后打开 扩展管理器(R)… 在已安装的扩展里可以看到NuGet Package Manager已经安装好了 使用NuGet下载需要的类库 1. 打开NuGet管理界面 2. 出现如下界面,可以在里面找自己想要的类库也可以在右上角搜索里面输入关键字查找自己想要的类库,找到合适自己的类库后点install进行安装 3. 这里我们选择安装Json.Net,点击安装好出现组件下载界面 4. 下载完成后会出现提示将类库安装到什么项目,这里我们选择安装到TestConsole项目 5. 安装完成后可以看到已经安装的Josn.Net显示一个已安装的小对勾 6. 打开项目引用可以看到我们刚选择的类库Newtonsoft.Json已经自动添加到项目引用中 使用命令行管理你的类库 1. NuGet提供了命令行安装方法,在菜单中选择Package Manager Console,打开命令行控制台 2. 出现NuGet控制台界面,默认类库源(Package source)为官方站点,也可以指向自己搭建的本地或内网站点,Default project表示默认将下载的类库添加到那个项目的引用中 3. NuGet控制台有几个常用命令 Get-Package 获取当前项目已经安装的类库 Install-Package 安装指定类库,命令格式如下:Install-Package 类库ID,如Install-Package Newtonsoft.Json 这里需要注意的是类库的ID是唯一的,指向命令后会自动搜索指定类库源里指定ID类库,若找到则自动下载并添加引用,找不到则会出现找不到类库的提示 Uninstall-Package 卸载指定类库,命令格式如下:Uninstall-Package 类库ID,如Uninstall-Package Newtonsoft.Json Update-Package 更新指定类库,命令格式如下:Update-Package 类库ID,如Update-Package Newtonsoft.Json ps:刚开始不熟悉时可以使用界面方式下载和更新类库,有一定经验后还是建议使用控制台添加、更新类库这样很方便,由于使用控制台需要知道类库的准确ID,可以到http://www.nuget.org/packages这里去查找,把自己常用的ID记录下方便以后使用。   from:http://kb.cnblogs.com/page/143190/

龙生   15 Apr 2015
View Details

若要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet

请将 JsonRequestBehavior 设置为 AllowGet MVC 默认 Request 方式为 Post。 action 1 public JsonResult GetPersonInfo() { 2 var person = new { 3 Name = "张三", 4 Age = 22, 5 Sex = "男" 6 }; 7 return Json(person); 8 } 或者 01 public JsonResult GetPersonInfo() { 02 return Json (new{Name = "张三",Age = 22,Sex = "男"}); 03 } 04 view 05 $.ajax({ 06 url: "/FriendLink/GetPersonInfo", 07 type: "POST", 08 dataType: "json", 09 data: { }, 10 success: function(data) { 11 $("#friendContent").html(data.Name); 12 } 13 }) POST 请求没问题,GET 方式请求出错: […]

龙生   13 Apr 2015
View Details

处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

今天安装了windows7 开发web项目需要安装IIS,当安装完以后,web程序已经映射到了本地IIS上,运行出现如下错误提示 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 原因: vs2010默认的是4.0框架,4.0的框架是独立的CLR,和2.0的不同,如果想运行4.0的网站,需要用aspnet_regiis注册4.0框架,然后用4.0的Class池,就可以运行4.0的web项目了. 如何用aspnet_regiis注册4.0框架 : 方法如下,启动cmd (win键+R 启动cmd)  ,找到 4.0所在的目录,本人机器目录是 ; 注意:要以管理员的身份运行DOS窗口。 复制上面的目录  C:\Windows\Microsoft.NET\Framework\v4.0.30319 启动CMD进入上面的目录,如下图 回车后 如下图 已经进入 C:\Windows\Microsoft.NET\Framework\v4.0.30319 此目录 然后运行  aspnet_regiis.exe -i  如下图 稍等一会,  aspnet_regiis 注册后如下图 ok,这时的IIS就可以运行 .net 4.0 部署的网站了. from:http://blog.163.com/wger_163_dh/blog/static/142646155201151394642791/

龙生   28 Mar 2015
View Details

VS2012创建MVC3项目提示错误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”

  VS2012已经全面切换到使用NuGet这个第三方开源工具来管理项目包和引用模块了,使用VS2012开发,都要装NuGet插件(官网:http://nuget.org),进官网点安装就进入了微软的下载页面,选择vs2012版本的NuGet.Tools.vsix文件,双击安装就可以了。 from:http://www.cxyclub.cn/n/20504/

龙生   27 Mar 2015
View Details
1 30 31 32 48