免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3344 | 回复: 0
打印 上一主题 下一主题

~~web.config信息及RSA加密方式!经验之谈~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-14 10:55 |只看该作者 |倒序浏览
~~web.config信息及RSA加密方式!经验之谈~~

web.config信息及RSA加密方式!
     
    我们都知道web.config可以保存连接字符串,我们在程序中也都是这么做的,web.config是XML,所

以它有清晰的结构,是我们很容易可以读懂它,但是这也出现一个问题,我们数据库完全暴露给浏览该文

件的人,这是我们所不希望的。我们可以使用一个简单有效的加密算法来加密这段连接字符,使直接浏览

该文件的人不能清楚地看到这些信息。
     我们一般以下面的形式保存连接字符串:
     <appSettings>
     <add key=\"ConnectionString\" value=\"server=localhost;database=mydb;pwd=sa;uid=sa;\" />
     </appSettings>
     为了我们自己可以看得明白这些加密的字符我们需要一个额外的程序专门生成这些加密数据(这个

额外的程序你可以写得很复杂但是为了说明问题,我们使用简单的base64编码数据,这其实不是加密数据

,但是原理是一样的)。下面用来生成明文到密文的(base64)转换,如果使用其它的加密算法可以替换

这个加密过程
     
     byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes(this.textBox1.Text);
     string encrystr = Convert.ToBase64String(data);
     
     

encrystr就是变码以后的字符。我们可以将我们web.config里面的连接字符(\"server=localhost;databa

se=mydb;pwd=sa;uid=sa;\")取出来放在这个程序里面执行生成一个新的字符串(c2VydmVyPWxvY2FsaG9zd

DtkYXRhYmFzZT10ZXN0O3B3ZD1zYTt1aWQ9c2E71)。
    之后我们用这个字符替换未编码的字符串。如下所示:
     <appSettings>
     <add key=\"ConnectionString\"

value=\"c2VydmVyPWxvY2FsaG9zdDtkYXRhYmFzZT10ZXN0O3B3ZD1zYTt1aWQ9c2E7\" />
     </appSettings>
     同样在我们的程序里面也需要解密,最后就是在程序中如何使用了,我们的程序需要理解这个字符

串的意义,我们在数据访问层里面添加如下的解密方法
     string strconn =

System.Configuration.ConfigurationSettings.AppSettings[\"ConnectionString\"];
     byte[] data = Convert.FromBase64String(strconn);
     string strReal = System.Text.ASCIIEncoding.ASCII.GetString(data);
     
    这样就可以得到真实的连接字符串了。
     上文一个简单的加密(伪加密,其实本文实现的是一个编码而非加密)的方法,也许可以骗过一些

人的眼睛,但是对于了解内幕的人还是起不到什么保护的作用,所以你可以扩展这个算法,使用对称或者

非对称的加密算法替换该案例里面的编码算法,这样基本上就万无一失了。
     
     
    下面介绍如何使用非对称RSA加密的方法:
     
    加密:
     
    <%@ Page language=\"c#\" AutoEventWireup=\"false\"%>
    <%@ Import Namespace= \"System.Security.Cryptography\" %>
    <%@ Import Namespace= \"System.IO\" %>
    <%@ Import Namespace= \"System.Text\" %>
     
    <%
    string word = Request.Params[\"word\"];
    if(word == null){
     Response.Write(\"没有输入密码啦!!!\";
     return;
    }
     
    StreamReader sr = new StreamReader(@\"f:\\a.txt\",UTF8Encoding.UTF;
    string readpublickey = sr.ReadToEnd();
    sr.Close();
     
    RSACryptoServiceProvider crypt=new RSACryptoServiceProvider();
    UTF8Encoding enc=new UTF8Encoding();
    byte[] bytes=enc.GetBytes(word);
    crypt.FromXmlString( readpublickey );
    bytes = crypt.Encrypt( bytes,false );
    string encryttext=Convert.ToBase64String(bytes);
    string abb = Server.UrlEncode(encryttext);
    Response.Write(abb);
     
    Response.Write(\"<a href=\'take.aspx?word=\" + encryttext + \"\'>\" + encryttext + @\"</a>\";
    %>
     
    解密:
     
    <%@ Page language=\"c#\" AutoEventWireup=\"false\"%>
    <%@ Import Namespace= \"System.Security.Cryptography\" %>
    <%@ Import Namespace= \"System.IO\" %>
    <%@ Import Namespace= \"System.Text\" %>
     
    <%
    string word = Request.QueryString[\"word\"];
    if(word == null){
     Response.Write(\"没有传来密码啦!!!\";
     return;
    }
     
    StreamReader sr = new StreamReader(@\"f:\\b.txt\",UTF8Encoding.UTF;
    string readprivatekey = sr.ReadToEnd();
    sr.Close();
     
    Response.Write(\"<br>\" + word);
     
    RSACryptoServiceProvider crypt=new RSACryptoServiceProvider();
    UTF8Encoding enc=new UTF8Encoding();
    byte[] bytes = Convert.FromBase64String(@word);
    crypt.FromXmlString ( readprivatekey ) ;
    byte[] decryptbyte = crypt.Decrypt( bytes,false );
    string decrypttext=enc.GetString( decryptbyte );
     
    Response.Write(decrypttext);
     
    %>
     
    公匙在a.txt文件中,私匙在b.txt文件中.
     
    制造公匙和私匙的方法如下:
     
    crypt=new RSACryptoServiceProvider();
    publickey=crypt.ToXmlString(false);//公匙
    privatekey=crypt.ToXmlString(true);//私匙
    crypt.Clear();
     
    //写入文本文件中
    StreamWriter one=new StreamWriter(@\"f:\\a.txt\",true,UTF8Encoding.UTF;
    one.Write(publickey);
    StreamWriter two=new StreamWriter(@\"f:\\b.txt\",true,UTF8Encoding.UTF;
    two.Write(privatekey);
    one.Flush();
    two.Flush();
    one.Close();
    two.Close();
    MessageBox.Show(\"成功保存公匙和密匙!\";
     
     小弟目前选用的是时代互联 http://now.net.cn/host/vps.net的专用C型空间,是支持ASP

ASP.NET+SQL SERVER2000数据库。对于他们的空间我也无话可说了。从2003年就开始使用了,中间也没有

出现过什么问题,速度也挺快的。后来偶尔听朋友说有时候打开速度有点儿慢。纳闷,后来才得知我们网

站是放着电信机房,而他用得是网通上网,出现了网间访问速度偏慢的问题。耶,想着郁闷呀。。。
     
     在这里郁闷的时节里,突然接到时代互联的电话,说他们公司在2005年1月份时,推出 Global CDN

全球网络镜像及加速引擎,可以完全避免这种“网间互联瓶颈”的问题。抱着一丝的惊喜,一娄的怀疑做

了个测试,果然效果不言而喻呀。
    对这个感兴趣的朋友可以进他们网站看看 http://********.net.cn/host/ ,大家去申请试用一下,还

有大家要点他们的镜象站点试试速度哦!! 我就不多说啦。

[

/url]

   小弟还推荐一款商务C型的空间,也不错!!

    商务C型主机+.CN 1600 元/年,免费加送CDN网站加速器500独立空间,支持ASP/ASP.NET免费送800Mb

邮箱Win2003,IIS 6.0,支持50M SQLSERVER 2000ACCESS 数据库提供计数器,留言板脚本列表 ASP

ASP.NET ActivePerl CGIASP.NET 1.1 Microsoft Front Page 2000 扩展

呵,需要的老哥就不要犹豫,想试用就点击:[url]http://now.net.cn/host/commerce.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP