2005年12月30日星期五

感冒·睡觉·运动会·合同
















 



















感冒·睡觉·运动会·合同


感冒篇
在同事的轮番轰炸下,我终于抵不住感冒的诱惑,I've caught a cold(今天怎么感觉caught这个词看起来怪怪的) ! 随之而来的就是每次感冒必发的鼻炎。多亏了姐姐带回来的BreatheRight,通畅的呼吸使我在慢慢长夜不至无法安心入眠。这里还要谢谢倩把她的那盒也给我了;-)。


武汉的天气阴沉沉的,又不天晴又不下雨,加上感冒了,着实让人感到很压抑。


睡觉篇
现在发现睡觉真是个好东西。昨天貌似受到的不公正待遇的不爽和一切不开心的事情竟在一夜的睡眠全部烟消云散了。一颗感康+睡个觉感觉感冒症状缓解了很多。今天的天气依然阴沉,压抑的感觉却好了很多。Edifier 1900T II音箱和Panasonic的Portable CD组成的床头音响也为阴天下快乐的心情润色不少。
还是那句话:Everything Enjoy your Life!
如果你每天都享受生活带来的一切,而不是为它所累,心情就会轻松许多。


运动会篇
下午单位运动会要长跑还要拔河。昏,为什么要选这么暴力的项目呢?打打网球、打打乒乓球,至多打打篮球都是不错的啦。准备一下:长跑——跟着后面走;拔河——跟着后面倒...


合同篇
刚刚才把合同签了,旷世以久的传说中的合同终于TMD签了(签的日期居然要写十月一号)。难怪今天心情不错,貌似外面也有了点阳光。不过不知怎的,我并没有感到很兴奋,签完字好像是签了个不平等条约,有点郁闷...









[ 重要级别 : 红高 黄中 绿低 ]






Web page counters

Hit 
Counter










 
 

阅读全文...

2005年12月29日星期四

乱七八糟


 











乱七八糟

----------------------------
画地图

是我上班以来,我们部门出现的最大事故:水果湖地区光纤环路被挖断,部分网络服务终止长达近一个星期。最大的问题还不在于网路被挖断,而是以前施工队的图纸完全不对。不过当时我在外面闭关,逃过了在冬天的水果湖畔压马路。不过前天老大还是把勘查环路的任务交给我了。花了半天环水果湖实地考察(拿张图纸在小区转悠别人都以为是建筑开发商,回头率较高,哈哈),一天半的绘制,水果湖地区的光纤敷设图终于完成了。看看还是蛮有成就感的。Microsoft Visio还真是不错,各种设施的示意图模版里面几乎都有,大大减少了工作量。以后在简历上又可以吹嘘“熟练使用Microsoft Visio”了,嘿嘿。


水果湖环网缩略图

(别看没什么,源文件放大了内容就多了 )

-----------------------------
圣诞节通宵的后遗症

诞节通宵的后遗症:每天很早想睡觉;精神错乱;流鼻涕;聊天时出现频度最高的词就是“昏”

 

------------------------------
悔过

 

天抱着学习的态度浏览别人的Space的时候,一不小心点开一个记录个人隐私的Blog,在此向那个Blog记录中的相关人员表示道歉。鄙人并非有意。
God Forgive me!

----------------------------------------------Ending

阅读全文...

恶作剧

阅读全文...

2005年12月22日星期四

VMware 中RedHat 的VMtools 安装







          VMware 中RedHat 的VMtools 安装



        为了避免调试过程不断重启的麻烦,我选择在虚拟机(VMWare)下安装RadHat Enterprise Linux AS 4。用Linux text进入安装,安装好后(我仅仅安装了Text界面,并未安装GNOME、KDE等组件)。虽说仅仅在文本模式下装不装VMTools对系统并没有什么显示效果上和性能的提升,但是每次切换到主操作系统时感叹号的提示总看得不爽,于是我还是把它装了。


        安装过程其实网上到处都有,我就简单的记录一下,顺便把网络上互相抄袭,但是还是存在的问题修正一下:


VMware Workstation 5.5中,在安装 X:\Program Files\VMware\VMware Workstation 目录下有 4个ISO文件,windows.iso   linux.iso  netware.iso   freebsd.iso
在VM菜单 VM-> Removable devices ->CD ROM(IDE1:0) -> EDIT.. -> Use iso image   选定Linux.iso


1. 首先在文本登录界面,用你的根用户账号(root)和密码登录。


2. 然后挂载光驱设备 ➩mount -t iso9660 /dev/cdrom /mnt


3. 光驱挂载成功后,进入/mnt目录下➩cd /mnt,再用“ls”命令显示其下的内容➩ls /mnt/。这时发现多了一个文件:VMwareTools-5.5.0-18463.tar.gz,这就是VMware Tools的Linux安装包。


4. 然后再把该文件拷贝到tmp目录下 ➩cp /mnt/VMwareTools-5.5.0-18463.tar.gz /tmp


5. 现在虚拟机光驱的使命完成了,应该把它卸载 ➩umount /dev/cdrom        ......①


6.接下来应该解压缩VMwareTools-5.5.0-18463.tar.gz文件。首先进入tmp目录 ➩cd /tmp,将其解压缩  ➩tar zxf VMwareTools-5.5.0-18463.tar.gz,把它释放到目录vmware-tools-distrib下。   ......②


7. 然后进入解压后的目录 ➩cd vmware-tools-distrib,用“ls”命令显示其下的内容,从中可以看到vmware-install.pl是VMware Tools的安装程序。


8. 最后运行该安装程序 ➩./vmware-install.pl,然后根据屏幕提示一路回车。到此整个安装过程算是完成了。


----------------------------------------------------------


①切记要umount cdrom,否则安装到最后会出现unable to create the directory /mnt/hgfs
Execution aborted. 的错误,我就犯过这个错误。


②tar参数:-c, --create  建立新的存档


                 -f, --file [HOSTNAME:]F  指定存档或设备 (缺省为 /dev/rmt0)   


                     --force-local  强制使用本地存档,即使存在克隆


                 -x, --extract, --get   从存档展开文件


                 -z, --gzip, --ungzip 用 gzip 对存档压缩或解压

阅读全文...

2005年12月20日星期二

Perhaps...Love

阅读全文...

2005年12月18日星期日

羽绒服 禽流感?


昨日去逛商场买一件羽绒服。

同行的一同学想买一件棉袄,

环顾四周,

大小专卖店90%都卖的是羽绒服。

本人窃喜,

不禁感叹种类繁多、琳琅满目。

我那同学却口出惊人之语:

“这么多的羽绒不会是今年禽流感的副产品吧?”

 

无语,汗......

阅读全文...

2005年12月14日星期三

I'm Back !

















                             

 

                              I'm Back !

 

过廿六天的封闭,我终于又回来啦,哈哈!久违了,我的朋友们,周末又可以出来一起玩了。其实这段时间也就前十天忙一点,后来几乎都是坐在那里上网待命。为了不让时间浪费,我又去买了本《Advanced Visual Basic.NET——Programming Web and Desktop Applications in ADO.NET and ASP.NET》,感觉写的还不错,又比较通俗,除了价格(¥68)以外,都还觉得很满意。比较郁闷的是工作的机器上没有.Net环境,只好干看书,最多也就查查在线的MSDN。不过说回来,工作的待遇还不错,包吃包住的,又有暖气又有24小时的热水,不时发发水果零食之类的,还有不错的补贴,今天临走的时候还发了一双Nike Shoes。这可是我上班以来受到的最好待遇啦,呵呵。
        回来刚把被子、床单套好,就上来更新我的Blog了。时间不早了,要准备晚饭了。明天去单位看看,反正在家也没什么事,好久没见到这边单位的同事了,竟有点想念,呵呵。
        元月五号还要回来处理没处理完的事,那时候又可以爽几天了


 

阅读全文...

2005年12月11日星期日

手绘











                    手绘韩星


  手工素描的韩国明星,还真是像,MOP上看见的,不得不PF。 



 everything Enjoy u liFe ..



 

阅读全文...

2005年12月9日星期五

防火墙并发数讨论







防火墙并发数讨论



        并发连接数是防火墙最常见的参数,在厂家的产品说明书中,大家经常可以看到,从低端设备的500个并发连接,一直到高端设备的数十万个并发连接,存在巨大的差异。那么,什么是并发连接数?它对采购防火墙有什么影响?

      并发连接数是指防火墙或代理服务器对其业务信息流的处理能力,是防火墙能够同时处理的点对点连接的最大数目,它反映出防火墙设备对多个连接的访问控制能力和连接状态跟踪能力,这个参数的大小直接影响到防火墙所能支持的最大信息点数。


并发连接数是衡量防火墙性能的一个重要指标。在目前市面上常见防火墙设备的说明书中大家可以看到,从低端设备的500、1000个并发连接,一直到高端设备的数万、数十万并发连接,存在着好几个数量级的差异。那么,并发连接数究竟是一个什么概念呢?它的大小会对用户的日常使用产生什么影响呢?要了解并发连接数,首先需要明白一个概念,那就是“会话”。这个“会话”可不是我们平时的谈话,但是可以用平时的谈话来理解,两个人在谈话时,你一句,我一句,一问一答,我们把它称为一次对话,或者叫会话。同样,在我们用电脑工作时,打开的一个窗口或一个Web页面,我们也可以把它叫做一个“会话”,扩展到一个局域网里面,所有用户要通过防火墙上网,要打开很多个窗口或Web页面发(即会话),那么,这个防火墙,所能处理的最大会话数量,就是“并发连接数”。

像路由器的路由表存放路由信息一样,防火墙里也有一个这样的表,我们把它叫做并发连接表,是防火墙用以存放并发连接信息的地方,它可在防火墙系统启动后动态分配进程的内存空间,其大小也就是防火墙所能支持的最大并发连接数。大的并发连接表可以增大防火墙最大并发连接数,允许防火墙支持更多的客户终端。尽管看上去,防火墙等类似产品的并发连接数似乎是越大越好。但是与此同时,过大的并发连接表也会带来一定的负面影响:,

1.并发连接数的增大意味着对系统内存资源的消耗

   以每个并发连接表项占用300B计算,1000个并发连接将占用300B×1000×8bit/B≈2.3Mb内存空间,10000个并发连接将占用 23Mb内存空间,100000个并发连接将占用230Mb内存空间,而如果真的试图实现1000000个并发连接的话那么,这个产品就需要提供 2.24Gb内存空间!

 

2.并发连接数的增大应当充分考虑CPU的处理能力

   CPU的主要任务是把网络上的流量从一个网段尽可能快速地转发到另外一个网段上,并且在转发过程中对此流量按照一定的访问控制策略进行许可检查、流量统计和访问审计等操作,这都要求防火墙对并发连接表中的相应表项进行不断的更新读写操作。如果不顾CPU的实际处理能力而贸然增大系统的并发连接表,势必影响防火墙对连接请求的处理延迟,造成某些连接超时,让更多的连接报文被重发,进而导致更多的连接超时,最后形成雪崩效应,致使整个防火墙系统崩溃。

 

3.物理链路的实际承载能力将严重影响防火墙发挥出其对海量并发连接的处理能力  

   虽然目前很多防火墙都提供了10/100/1000Mbps的网络接口,但是,由于防火墙通常都部署在Internet出口处,在客户端PC与目的资源中间的路径上,总是存在着瓶颈链路——该瓶颈链路可能是2Mbps专线,也可能是512Kbps乃至64Kbps的低速链路。这些拥挤的低速链路根本无法承载太多的并发连接,所以即便是防火墙能够支持大规模的并发访问连接,也无法发挥出其原有的性能。

 

有鉴于此,我们应当根据网络环境的具体情况和个人不同的上网习惯来选择适当规模的并发连接表。因为不同规模的网络会产生大小不同的并发连接,而用户习惯于何种网络服务以及如何使用这些服务,同样也会产生不同的并发连接需求。高并发连接数的防火墙设备通常需要客户投资更多的设备,这是因为并发连接数的增大牵扯到数据结构、CPU、内存、系统总线和网络接口等多方面因素。如何在合理的设备投资和实际上所能提供的性能之间寻找一个黄金平衡点将是用户选择产品的一个重要任务。按照并发连接数来衡量方案的合理性是一个值得推荐的办法。

 

以每个用户需要10.5个并发连接来计算,一个中小型企业网络(1000个信息点以下,容纳4个C类地址空间)大概需要10.5×1000=10500个并发连接,因此支持20000~30000最大并发连接的防火墙设备便可以满足需求;大型的企事业单位网络(比如信息点数在1000~10000之间)大概会需要105000个并发连接,所以支持100000~120000最大并发连接的防火墙就可以满足企业的实际需要; 而对于大型电信运营商和ISP来说,电信级的千兆防火墙(支持120000~200000个并发连接)则是恰当的选择。为较低需求而采用高端的防火墙设备将造成用户投资的浪费,同样为较高的客户需求而采用低端设备将无法达到预计的性能指标。利用网络整体上的并发连接需求来选择适当的防火墙产品可以帮助用户快速、准确的定位所需要的产品,避免对单纯某一参数“愈大愈好”的盲目追求,缩短设计施工周期,节省企业的开支。从而为企业实施最合理的安全保护方案。

阅读全文...

2005年12月1日星期四

About INNER JOIN in SQL

SQL

解释语句:

sql="SELECT UserTable.KHBH, UserTable.UserName,DayFactorTable.QueryDate,DayFactorTable.TotalAddGrpNo";
  for (int i=1; i<=96; i++)    
 {
  sql = sql + ",DayFactorTable.Factor"+i;
 }     
        sql = sql + " FROM UserTable INNER JOIN GPTInfo ON UserTable.UserNo = GPTInfo.UserNo
                           INNER JOIN DayFactorTable ON GPTInfo.TermNo = DayFactorTable.TermNo " +     
                          "WHERE (UserTable.KHBH = '"+KHBH+"') AND (DayFactorTable.QueryDate >='"+QSRQ+"')AND  (DayFactorTable.QueryDate <='"+ZZRQ+"')";

-----------------------------------------------------------------------

此语句难点在于

        sql = sql + " FROM UserTable INNER JOIN GPTInfo ON UserTable.UserNo = GPTInfo.UserNo
                           INNER JOIN DayFactorTable ON GPTInfo.TermNo = DayFactorTable.TermNo " +     
                          "WHERE (UserTable.KHBH = '"+KHBH+"') AND (DayFactorTable.QueryDate >='"+QSRQ+"')AND  (DayFactorTable.QueryDate <='"+ZZRQ+"')";

中FROM UserTable INNER JOIN GPTInfo ON UserTable.UserNo = GPTInfo.UserNo INNER JOIN DayFactorTable ON GPTInfo.TermNo = DayFactorTable.TermNo 使用的INNER JOIN语法。


INNER JOIN操作用于组合两个表中的记录,只要在公共字段之中有相符的值。可以在任何的 FROM 子句中使用 INNER JOIN 运算。这是最普通的联接类型。只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。

语法:FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2

说明:table1, table2参数用于指定从其中组合记录的表的名称。
field1, field2参数指定被联接字段的名称。如果这些字段不是数值的,被联接的字段必须是相同的数据类型,并且包含相同类型的数据,但是它们不必名称相同。
compopr参数用于指定关系比较运算符,如:"=", "<", ">", "<=", ">=", 或 "<>"。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。在一个 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。


        因此此语句解释为:FROM(( UserTable INNER JOIN GPTInfo ON UserTable.UserNo = GPTInfo.UserNo)
                           INNER JOIN DayFactorTable ON GPTInfo.TermNo = DayFactorTable.TermNo )


是表UserTable和表GPTInfo将各自表中对应的UserNo项连接后再与表DayFactorTable中对应的TermNo项相连接。

阅读全文...

2005年11月29日星期二

在.NET中获取一台计算机名,IP地址及当前用户名


1. 使用ASP.NET中专用属性:
获取服务器电脑名:Page.Server.ManchineName
获取用户信息:Page.User
获取客户端电脑名:Page.Request.UserHostName
获取客户端电脑IP:Page.Request.UserHostAddress 
2. 在网络编程中的通用方法:
获取当前电脑名:static System.Net.Dns.GetHostName()
根据电脑名取出全部IP地址:static System.Net.Dns.Resolve(电脑名).AddressList
也可根据IP地址取出电脑名:static System.Net.Dns.Resolve(IP地址).HostName
3. 系统环境类的通用属性:
当前电脑名:static System.Environment.MachineName
当前电脑所属网域:static System.Environment.UserDomainName
当前电脑用户:static System.Environment.UserName

举例子来说明:


              using System.Net;
              private void ButtonIP_Click(object sender, System.EventArgs e)
              { 
                  System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
                  if (addressList.Length>1)
                  {   
                      TextLIP.Text = addressList[0].ToString();
                      TextSIP.Text = addressList[1].ToString();
                  }
                 else
                 { 
                      TextLIP.Text = addressList[0].ToString();
                      TextSIP.Text = "没有可用的连接";
                 }
             }

阅读全文...

2005年11月28日星期一

[翻译]微软.net加密技术简介[上]


作者:Paul D. Sheriff
PDSA.com
2003年10月
关键字:
.net
安全
Visual Basic? .NET
C#
概述:学习如何利用.net框架中的加密功能来保护你的数据。
下载代码:::URL::CryptoSampleCSSample.msi
                    ::URL::CryptoSampleVBSample.msi
正文:
你的电脑中有秘密吗?如果有,加密技术就是你最好的工具。加密技术是一种将有含义的字符转换为无含义的字符的科学,用以保证其不会被不具备权限的人阅读。加密技术的历史比计算机的历史还要久远。计算机出现以后,加密技术可以生成几乎不能攻破的密码。微软已经在Windows95中开发并发布了加密API。在.net中,崭新的类将复杂的算法封装在简单易用的方法和属性中。
玉米 牛肉 散列
如果你要做的只是避免密码被他人窃取,你需要创建密码的散列值。散列是一种单向算法,一旦数据被转换,就不可能重新得到数据的原值。大多数开发者使用数据库来存储密码,如果有人查看数据库中的用户数据,将得到用户的密码,除非你在数据库中存储的是密码的散列值。当用户输入用户密码时,你可以再次计算密码的散列值,将其与数据库中存储的散列值进行比较。散列的另一个副产品是,即使原始数据中的一小处修改将产生一个完全不同的散列值。例如“Pork”和“Porky”,进行散列运算后将产生完全不同的输出,而且两个输出之间没有任何联系。
对于.net开发者,有几种散列算法供选择,最常用的是SHA1和MD5。让我们看看如何将一个普通的字符串“Paul”进行散列运算,得到一个完全不可辨认的值。
使用SHA1计算散列
让我们创建一个新的例程来计算字符串“Paul”的散列值。在Visual Studio .NET中创建一个新的Windows应用程序,在窗体上拖放一个按钮。在按钮的Click事件中,调用一个名称为HashText的方法。下面就是你添加到窗体代码中用来试验散列算法的代码。在输入代码之前你需要引入System.Security.Cryptography命名空间。








以下内容为程序代码:

Private Sub HashText(ByVal TextToHash As String)
Dim SHA1 As SHA1CryptoServiceProvider
Dim bytValue() As Byte
Dim bytHash() As Byte

' Create New Crypto Service Provider Object
SHA1 = New SHA1CryptoServiceProvider

' Convert the original string to array of Bytes
bytValue = _
System.Text.Encoding.UTF8.GetBytes(TextToHash)

' Compute the Hash, returns an array of Bytes
bytHash = SHA1.ComputeHash(bytValue)

SHA1.Clear()

' Return a base 64 encoded string of the Hash value
Debug.WriteLine(Convert.ToBase64String(bytHash))
End Sub

你可以将一个字符串传入这个例程,以得到散列值。例如,你可以传入“Paul”这个字符串,调试窗口将显示下列字符:








以下内容为程序代码:

w2h6uYgMJt/nq5ZqihcBteAXwv8=

现在将传入的值改为“Pauly”,你可以看到如下输出:








以下内容为程序代码:

proywxJ0znMpGF5sbB18+7GSAsM=

正象你看到的,传入字符串的一处小小的改动就生成了一个完全不同的结果。这也是散列如此有效的原因————很难得到字符转换的模式或者从加密的字符串中得到原始字符串的内容。
使用MD5计算散列
一旦你学会了使用一个散列类,你已经基本上掌握了所有的散列类。下面的方法使用的就是MD5散列算法。我想你已经注意到代码基本上是相同的,除了CryptoServiceProvider类是不同的。








以下内容为程序代码:

Private Sub HashTextMD5(ByVal TextToHash As String)
Dim md5 As MD5CryptoServiceProvider
Dim bytValue() As Byte
Dim bytHash() As Byte

' Create New Crypto Service Provider Object
md5 = New MD5CryptoServiceProvider

' Convert the original string to array of Bytes
bytValue = System.Text.Encoding. _
UTF8.GetBytes(TextToHash)

' Compute the Hash, returns an array of Bytes
bytHash = md5.ComputeHash(bytValue)

md5.Clear()

' Return a base 64 encoded string of the Hash value
Debug.WriteLine(Convert.ToBase64String(bytHash))
End Sub

传入“Paul”,MD5算法输出的字符串如下:








以下内容为程序代码:

nVWBsHh1MKNctPioSyqyTQ==


加密的字符串和原始字符串完全不同。散列算法非常适合于用于密码,因为生成的字符串完全没有任何含义,所以黑客十分难于破解。你可以使用散列算法得到密码的散列值存储在数据库中。当用户输入密码时,你首先得到密码的散列值,然后通过网络发送散列值,和数据库中存储的散列值进行比较。请记住散列是单向操作,一旦进行散列操作,你永远不能恢复原始的密码。
如何选择算法
上面介绍的各种散列算法进行的操作是一样的。其区别只在于用于产生散列所用的键值(key)的长度,所用键值的长度越大,加密的安全性就越强。例如SHA1使用160位(bit)的加密键值,然而MD5使用的是128位的加密键值,所以SHA1比MD5更难于破解。
选择散列算法时另一点需要考虑的是,是否有实际的或理论上出现冲突的可能。如果重现冲突,两个截然不同的字符串经过散列运算后将得到同样的结果。SHA1在理论上和实际上,都没有出现冲突的可能。MD5在理论上可能出现冲突,但是在实际中却没有可能。所以选择散列算法的关键还是你需要的安全性。


创建散列应用范例
文章中包括两个散列应用范例,用以演示使用不同的散列算法加密任何字符串。这两个应用被命名为CryptoSampleVB.sln和CryptoSampleCS.sln。其中CryptoSampleVB是一个Visual Basic应用程序,CryptoSampleCS是C#应用程序。两个应用都包含一个图1所示的窗体(Form),你可以在其中输入你想要计算散列的字符串,你可以通过一个单选按钮选择使用的散列算法,结果将在一个文本框中显示。

图1创建一个通用散列窗体用以测试多种散列算法
当你点击窗体上的“Hash”按钮时,将触发按钮的Click事件,事件处理处理程序将调用一个名为HashString()的方法








以下内容为程序代码:

' Visual Basic .NET
Private Sub btnHash_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnHash.Click
txtHashed.Text = HashString(txtOriginal.Text)
End Sub
// C#
private void cmdHash_Click(object sender,
System.EventArgs e)
{
txtHashed.Text = HashString(txtOriginal.Text);
}

HashString()方法取得你输入的字符串并调用SetHash方法,这个方法将根据你在窗体中选择的单选按钮决定使用哪种加密服务提供者(cryptography service provider)来创建一个实例来返回调用者。程序将创建一个类型为HashAlgorithm,名为mHash的成员变量。HashAlgorithm是创建的所有加密服务提供者的基类。








以下内容为程序代码:

' Visual Basic .NET
Private mhash As HashAlgorithm

// C#
private HashAlgorithm mhash;

SetHash方法的代码如下:








以下内容为程序代码:

' Visual Basic .NET
Private Function SetHash() As HashAlgorithm
If optSHA1.Checked Then
Return New SHA1CryptoServiceProvider
Else
If optMD5.Checked Then
Return New MD5CryptoServiceProvider
End If
End If
End Function

// C#
private HashAlgorithm SetHash()
{
if(this.optSHA1.Checked)
return new SHA1CryptoServiceProvider();
else
return new MD5CryptoServiceProvider();
}

根据你在窗体上选择的单选按钮,将创建一个特定类型的HashAlgorithm型变量并从方法中返回给调用者。HashString()方法进行实际的数据加密操作:








以下内容为程序代码:

' Visual Basic .NET
Private Function HashString(ByVal Value As String) _
As String
Dim bytValue() As Byte
Dim bytHash() As Byte

' Create New Crypto Service Provider Object
mhash = SetHash()

' Convert the original string to array of Bytes
bytValue = System.Text.Encoding.UTF8.GetBytes(Value)

' Compute the Hash, returns an array of Bytes
bytHash = mhash.ComputeHash(bytValue)

mhash.Clear()

' Return a base 64 encoded string of the Hash value
Return Convert.ToBase64String(bytHash)
End Function


// C#
private string HashString(string Value)
{
mhash = SetHash();

// Convert the original string to array of Bytes
byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(Value);

// Compute the Hash, returns an array of Bytes
byte[] bytHash = mhash.ComputeHash(bytValue);

mhash.Clear();

// Return a base 64 encoded string of the Hash value
return Convert.ToBase64String(bytHash);
}

在HashString()方法中创建两个Byte数组,第一个数组保存用户输入的原始字符串,你可以利用System.Text.Encoding.UTF8.GetBytes()方法将用户输入的字符串转换为Byte数组。将用户输入的字符串转换为Byte数组后,你就可以利用服务提供者(service provider)的ComputeHash()方法计算字符串的散列值。这个方法接受一个Byte数组,并以Byte数组型式返回加密的字符串。
注意:完成散列操作后及时清理散列变量总是个好主意。计算字符串的散列值后,你可以调用Clear方法释放创建的散列变量。
现在你得到了一个加密后的Byte数组用以返回调用者。既然你想以字符串(string)而不是Byte数组的形式处理输入和输出的值,你应该调用Convert.ToBase64String方法返回加密结果的字符串格式。这个方法可以将一个Byte数组转换为Base64编码的字符串。既然你想将字符串用在网页中或存储在数据库中,你应该使用Base64编码的字符串。如果你不进行这样的转换,加密字符串中的某些ASCII字符将可能不能正确的显示或保存。

阅读全文...

[翻译]微软.net加密技术简介[下]

为散列加入扰乱值
迄今为止,散列算法最大的问题就是如果两个用户碰巧使用相同的密码,那么经过散列运算的值将完全相同。如果一个黑客看到你用于存储密码的数据表,他将找到模式并且知道大多数人会选择普通的单词作为密码,从而有可能通过字典攻击得到密码。保证任何两个用户的密码经散列运算后均得到不同的值的一种方法是,在进行散列运算之前,为每个用户的密码加上一个唯一的值。这个唯一的值被称为扰乱值(salt)。当你采用这种方案的时候,你必须保证将扰乱值作为用户数据的一部分保存。我建议你将用户名和密码存储在一个表中,而将扰乱值存储在另一个表中。这样可以为你的数据库提供额外的安全保障。
有很多方法可以为每一个用户的密码增加扰乱值。一个简单的方式是将一些其他的信息,例如用户的姓氏、名字、电子地址或者用户编码,和用户密码连接,然后进行散列运算。这种方法的缺点是既然你需要在同一个表中存储扰乱值,如果黑客找出了这个值,他将知道你所进行的操作。当然,这将增大黑客破解的难度,但是这是一项常见的技巧。
另一种方法就是使用.net框架类RNGCryptoServiceProvider生成一个包含数字的随机字符串。RNG表示随机数字生成器(Random Number Generator)。这个类将依照你指定的长度生成一个随机byte数组。你可以将这个随机byte数组作为散列算法的扰乱值。如果你选择这种方法,你必须安全的存储这个散列值。
在图2显示的第二个例子中,你可以在文本框中输入一个字符串,选择一种散列类型,然后生成一个扰乱值,和原始字符串连接后进行散列操作。
图2 利用扰乱值生成更加安全的散列密码
(你必须保存扰乱值以便能够再次生成一样的散列)
这个例子和本文前面的例子几乎完全相同,除了生成扰乱值的例程。在按钮的Click事件中,你将首先调用一个名为CreatSalt()的方法来生成唯一的扰乱值,然后将扰乱值存储在txtSalt文本框中。一旦你得到了这个唯一值,你就可以调用HashString方法,传入两个值的连接,得到散列值。
以下内容为程序代码:

' Visual Basic .NET
Private Sub btnHash_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnHash.Click
txtSalt.Text = CreateSalt()
txtHashed.Text = HashString(txtSalt.Text & _
txtOriginal.Text)
End Sub

// C#
private void cmdHash_Click(object sender, System.EventArgs e)
{
txtSalt.Text = CreateSalt();
txtHashed.Text = HashString(txtOriginal.Text);
}



CreateSalt方法的代码十分简单,它首先创建一个包含8个byte值的数组,然后创建一个RNGCryptoServiceProvider类的新实例,通过调用这个对象的GetBytes()方法就可以使用随机生成的字符填充byte数组了。然后这个数组被转换为一个Base64的字符串,被传回函数的调用者。
以下内容为程序代码:

' Visual Basic .NET
Private Function CreateSalt() As String
Dim bytSalt(8) As Byte
Dim rng As New RNGCryptoServiceProvider

rng.GetBytes(bytSalt)

Return Convert.ToBase64String(bytSalt)
End Function

// C#
private string CreateSalt()
{
byte[] bytSalt = new byte[8];
RNGCryptoServiceProvider rng;

rng = new RNGCryptoServiceProvider();

rng.GetBytes(bytSalt);

return Convert.ToBase64String(bytSalt);
}


双向加密
当你需要在两个或者更多个人或者计算机之间传递信息,且对方可以获得信息的内容,还要保证信息的内容不被其他人所窃取,加密技术就是解决的最好方案。加密技术可以将数据伪装成某种格式,理论上,只有授权的人才可以译解信息的真实内容。你可以通过给予一个特定的可解密信息的“键码”(Key)来完成授权,从而使得信息再次具有可读性。在.net框架中有几种加密/解密算法,本文侧重于其中的对称算法(symmetric algorithms),例如:
DES
RC2
Rijndael
TripleDES
对称算法(又称密码算法)通过一个键值和一个初始向量(Initialization Vector)保障数据的安全。传递消息的双方必须具有同样的键值和初始向量用以完成数据的加密和解密。初始向量是一组随机生成的字符,用来保证信息中的任何两个片断均生成不同的加密结果。键值可以通过.net中不同加密类的方法生成。密码的生成方法,超出了本文的讨论范围。
另一种加密方法叫做非对称加密算法(asymmetric algorithm),非对称加密算法采用公钥/私钥配对来完成数据的加密。非对称加密算法将在后面的章节中介绍。
如何选择加密算法
对称加密算法,或者称为密码算法,速度很快,故适用于加密较大的数据流。这些算法可同时用于加密和解密数据。虽然这些加密算法还算安全,但是如果有足够的时间,他人还是可以通过穷举所有的已知的密码组合来达到破解的目的。既然每一种加密算法均使用一个固定长度的密码,即ASCII字符,通过计算机程序穷举每一个可能的密码组合并最终得到正确的密码,是可行的。对称加密算法的一个常见用途是用以存储和取得数据库的连接字符串。
非对称加密算法,或者称为公钥加密算法的速度比对称加密算法要慢一些,但是生成的密文也更加难以破解。这些加密算法依赖于两个键值,一个称为公钥,另一个成为私钥。公钥用于对数据进行加密,私钥是唯一一个可以解密数据的键值。公钥和私钥是密不可分的,只有同时具备两个键值才能保证信息的正确传递。出于性能方面的考虑,非对称加密算法并不适于对大量的数据进行操作。非对称加密算法的常见用途之一是用以传递另一个用于对称加密操作的密码和初始向量。然后,来往于双方的信息就可以通过对称加密算法进行加密了。
散列算法用于你不希望再得到数据的原始值的情况,特别是你希望其他任何人都无法得到数据的原始值。散列算法可以将一个任意长度的字符串转换为一个固定长度的byte数组。散列操作是单向的,所以通常用于少量的数据,例如密码。如果用户再一个安全认证窗体上输入了密码,程序可以将输入的值进行散列操作,将得到的散列值存储于数据库中。即使数据库被攻破,既然密码已经被进行散列操作,任何人都无法得到密码的原始值。当用户需要登入系统的时候,用户输入的密码被用同样的算法进行散列操作,如果两个散列值吻合,系统就可以判定,用户两次输入的密码是相同的。
尝试加密
示例程序包括一个窗体,你可以选择DES或者TripleDES加密服务提供者,窗体的名称是frmEncrypt,如图3所示:

图3:加密算法允许你对数据进行加密和解密操作
你需要首先点击窗体上的Gen Key按钮,来生成加密操作需要的键值,然后点击Gen IV按钮,生成初始向量。在Original String文本框中输入原始字符串,然后点击Encrypt按钮。点击Encrypt按钮后,加密的字符串将显示在Encrypted String文本框中。如果你希望在你的应用程序中使用加密的字符串,你需要保存生成的键值和初始向量,以便在需要象连接字符串这样的信息的时候进行数据的解密操作。如果你遗失了键值或者初始向量,你将无法还原原始的连接字符串。
现在让我们看看窗体后面实现加密和解密功能的代码。首先,我们看看类中的用以保存合适的加密服务提供者的成员变量。这个成员变量的类型是SymmetricAlgorithm,所有对称加密算法类均继承自此基类。
以下内容为程序代码:

' Visual Basic .NET
Private mCSP As SymmetricAlgorithm
// C#
private SymmetricAlgorithm mCSP;



mCSP变量将根据你选择的单选按钮,被赋以特定的对称加密算法类实例。SetEnc()方法负责为不同的方法创建并返回正确的类实例。
以下内容为程序代码:

' Visual Basic .NET
Private Function SetEnc() As SymmetricAlgorithm
If optDES.Checked Then
Return New DESCryptoServiceProvider
Else
If optTripleDES.Checked Then
Return New TripleDESCryptoServiceProvider
End If
End If
End Function

// C#
private SymmetricAlgorithm SetEnc()
{
if(optDES.Checked)
return new DESCryptoServiceProvider();
else
return new TripleDESCryptoServiceProvider();
}



正象你看到的,根据你在窗体上选择的单选按钮,将创建一个DESCryptoServiceProvider或者TripleDESCryptoServiceProvider类型的对象。
王国的钥匙——键值
使用对称加密算法,你必须提供一个键值。每一个CryptoSymmetricAlgorithm的实现都支持GenerateKey方法,这些方法实际上使用的时公共语言运行时中的随机数字生成类。让我们看看Gen Key按钮的单击事件处理程序时怎样生成一个随机的键值的:
以下内容为程序代码:

' Visual Basic .NET
Private Sub btnKeyGen_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) _
Handles btnKeyGen.Click
mCSP = SetEnc()

mCSP.GenerateKey()

txtKey.Text = Convert.ToBase64String(mCSP.Key)
End Sub
// C#
private void btnKeyGen_Click(object sender,
System.EventArgs e)
{
mCSP = SetEnc();

mCSP.GenerateKey();

txtKey.Text = Convert.ToBase64String(mCSP.Key);
}



得到特定的服务提供者实现后,你可以调用GenerateKey方法创建一个供加密使用的随机键值。键值的长度取决于你加密使用的服务提供者。例如,DES键值的长度是64位,而TripleDES的键值长度是192位。每一个SymmetricAlgorithm类都提供一个KeySize属性,用来返回用来生成密文的键值的长度。
你同样需要生成一个初始向量(IV),初始向量将帮助算法逐块生成最终的加密字符串。初始向量用于对第一块数据进行加密,如果你没有提供初始向量,键值相同的时候所有的待加密的字符串将遵从相同的模式进行加密。所以可以将初始向量看作一个加密数据时使用的“随机”组件。实际上,即使你使用相同的键值,如果初始向量不同。下面就是Gen IV按钮生成新的初始向量的代码:
以下内容为程序代码:

' Visual Basic .NET
Private Sub btnIVGen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIVGen.Click
mCSP.GenerateIV()

txtIV.Text = Convert.ToBase64String(mCSP.IV)
End Sub

// C#
private void btnIVGen_Click(object sender,
System.EventArgs e)
{
mCSP.GenerateIV();

txtIV.Text = Convert.ToBase64String(mCSP.IV);
}



上面的代码和生成键值的代码十分类似。每一个加密服务提供者都有一个GenerateIV()方法,在你没有提供初始向量的时候生成需要的初始向量。
加密数据
一旦你得到了键值和初始向量,你就可以使用Key、IV和Original String来生成原始字符串的加密结果。当你点击Encrypt按钮的时候,下面的代码将被运行:
以下内容为程序代码:

' Visual Basic .NET
Private Sub btnEncrypt_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmdEncrypt.Click
txtEncrypted.Text = EncryptString(txtOriginal.Text)
End Sub

// C#
private void cmdEncrypt_Click(object sender, System.EventArgs e)
{
txtEncrypted.Text = EncryptString(txtOriginal.Text);
}



单击事件处理程序将调用一个叫EncryptString()的方法,从Original String文本框中取得原始字符串,然后对其进行加密。它将返回的加密字符串显示在Encrypted String文本框中,下面就是EncryptString方法的代码:
以下内容为程序代码:

' Visual Basic .NET
Private Function EncryptString(ByVal Value As String) _
As String
Dim ct As ICryptoTransform
Dim ms As MemoryStream
Dim cs As CryptoStream
Dim byt() As Byte

ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV)

byt = Encoding.UTF8.GetBytes(Value)

ms = New MemoryStream
cs = New CryptoStream(ms, ct, CryptoStreamMode.Write)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()

cs.Close()

Return Convert.ToBase64String(ms.ToArray())
End Function

// C#
private string EncryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;

ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);

byt = Encoding.UTF8.GetBytes(Value);

ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();

cs.Close();

return Convert.ToBase64String(ms.ToArray());
}



让我们逐行进行分析,首先你需要为加密过程定义几个变量:
以下内容为程序代码:

Dim ct As ICryptoTransform
Dim ms As MemoryStream
Dim cs As CryptoStream
Dim byt() As Byte



ICryptoTransform 是一个接口,用以调用任何一种服务提供者的CreateEncryptor方法,调用将返回一个实际的encryptor变量,其中就包含这个接口的定义。
接下来你需要将原始的字符串转换为byte数组,大多数的.net加密算法处理的数据是byte数组,而非字符串。
以下内容为程序代码:

byt = Encoding.UTF8.GetBytes(Value)



现在你就可以进行真正的加密操作了。这个过程包括创建一个用以存储加密的byte数据的数据流(stream)。你将一个名为ms的MemoryStream和一个ICryptoTransform对象作为参数传入CryptoStream的构造函数,另一个枚举型常量参数定义了你创建类的模式(读,写,或其他的什么)。一旦创建了CryptoStream对象,你可以利用CryptoStream对象的Write方法将数据写入内存流(memory stream)中。这个方法执行了实际的加密操作,它逐块的加密了原始数据,将加密后的数据写入MemoryStream对象。
以下内容为程序代码:

ms = New MemoryStream
cs = New CryptoStream(ms, ct, CryptoStreamMode.Write)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()

cs.Close()



一旦数据被写入MemoryStream对象,代码便调用了CryptoStream对象中的FlushFinalBlock方法,以保证所有的数据被写入FlushFinalBlock对象,同时也将关闭CryptoStream对象。
最后,程序将内存流中存储的byte数组转化为字符串以便在窗体中的文本框中进行显示。你可以使用MemoryStream ToArray()方法将byte数组从流中取出,然后调用Convert.ToBase64String()方法,这个方法将byte数组中的数据取出以Base64格式进行输出以得到可读的结果。
解密你的数据
对数据进行加密后,你也会需要得到数据的原始值。解密的过程十分简单,并且很类似于加密的过程。你需要提供和进行加密时一致的键值和初始向量。SymmetricAlgorithm的Key和IV属性被定义为Byte数组,所以你需要在设定这些属性之前将其转换为byte数组。让我们看看窗体中进行加密字符串的DecryptString方法,这个方法通过Decrypt按钮的Click事件处理程序进行调用:
以下内容为程序代码:

' Visual Basic .NET
Private Function DecryptString(ByVal Value As String) _
As String
Dim ct As ICryptoTransform
Dim ms As MemoryStream
Dim cs As CryptoStream
Dim byt() As Byte

ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV)

byt = Convert.FromBase64String(Value)

ms = New MemoryStream
cs = New CryptoStream(ms, ct, CryptoStreamMode.Write)
cs.Write(byt, 0, byt.Length)
cs.FlushFinalBlock()

cs.Close()

Return Encoding.UTF8.GetString(ms.ToArray())
End Function

// C#
private string DecryptString(string Value)
{
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;

ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);

byt = Convert.FromBase64String(Value);

ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();

cs.Close();

return Encoding.UTF8.GetString(ms.ToArray());
}



加密和解密的函数有三点区别:
1、必须使用CryptoServiceProvider的CreateDecryptor方法创建合适的ICtryptoTransform对象。
2、需要从一个Base64编码的字符串创建一个byte数组,可以借助Convert.FromBase64String方法实现这个功能。
3、需要通过对原始byte数组进行转换创建一个合适的内存流。还需要将内存流中的数据从byte数组转换为普通的字符串,以便可以在窗体上进行显示,可以借助Encoding.UTF8.GetString()方法进行上述转换。
注意:Encoding.UTF8类包含在System.Text工作空间内

阅读全文...

What is VRM

voltage regulator module

A voltage regulator module (VRM) is an installable module that senses a computer's microprocessor voltage requirements and ensures that the correct voltage is maintained. If you are changing your computer's microprocessor (for example, changing from a Pentium to a Pentium Pro or a Pentium with MMX), you need to add a voltage regulator module to the existing voltage regulator in the motherboard so that the new voltage requirements can be detected and accommodated.
In the case of the Pentium, the original Pentium has the same voltage requirement for its core or basic operation as for its I/O operation. Both use 2.8 volts. However, the Pentium Pro and the Pentium with MMX have different voltage requirements for core (2.8 volts) and I/O (3.3 volts). Adding a VRM allows it to regulate the voltage for I/O while the original regulator built into the motherboard continues to regulate core voltage.

----------------------------------------------------------

今天Dell PowerEdge4600 服务器启动报错(VRM for Prossessor is not installed...)查资料所学。

阅读全文...

2005年11月10日星期四

加菲猫语录法文版


money is not everything. There’s MasterCard & Visa
钞票不 是万能的, 有时还需要信用卡
l'argent n'est pas toute-puissant,parfois on a besoin de la carte de credit.

One should love animals. They are so tasty.
每个人都应该热爱动物, 因为它们很好吃
on dois aimer les animaux,car ils sont delicieux.

Save water. Shower with your girlfriend.
要节约用水, 尽量和女友一起洗澡
Economie l'eau.prends un bain avec ta petite amie.
 
Love the neighbor. But don't get caught.
要用心去爱你的邻居, 不过不要让她的老公知道
aime la  voisine,mais ne fais pas  son mari le savoir.

Behind every successful man, there is a man. And behind every unsuccessful man, there are two.  
每个成功男人的背后, 都有一个女人.  每个不成功男人的背后, 都有两个
En arriere d'un homme reussi,il y a une femme.et en arriere des hommes defait.il y'en a deux.
 
Every man should marry. After all, happiness is not the only thing in life.
再快乐的单身汉迟早也会结婚, 幸福不是永久的嘛
tous les hommes doivent se marier.par consequent.bonneur n'est pas la seule chose dans la vie.
 
The wise never marry, and when they marry they become otherwise.     
聪明人都是未婚的, 结婚的人很难再聪明起来
le sage ne se marie pas, mais apres mariage, il devient  idiot.
 
Success is a relative term. It brings so many relatives.                                           
成功是一个相关名词, 他会给你带来很多不相关的亲戚 (联系)
succes est un nom relatif,celui-ci t'apporte bp de relations.
 
Never put off the work till tomorrow what you can put off today.                                  
不要等明天交不上差再找借口, 今天就要找好
ne distrairas pas le travail jusque demain que tu peux distraire aujourd'hui.
 
Love is photogenic. It needs darkness to develop.                                                 
爱情就象照片, 需要大量的暗房时间来培养
l'amour comme la photo,il faut obscurite qui le develope.

Children in backseats cause accidents. Accidents in backseats cause children.                    
后排座位上的小孩会生出意外, 后排座位上的意外会生出小孩


Your future depends on your dreams. So go to sleep.                                              
现在的梦想决定着你的将来, 所以还是再睡一会吧
 ta future depend de son reve,donc va te coucher.

There should be a better way to start a day than waking up every morning.                       
应该有更好的方式开始新一天, 而不是千篇一律的在每个上午都醒来
il faudrait qu'il y ait meillieur facon pour commencer un jour que reveil chaque matin
 

Hard work never killed anybody. But why take the risk?                                         
努力工作不会导致死亡! 不过我不会用自己去证明
 travaille dur ne cause pas la mort,mais pourquoi on s'y risquera .

Work fascinates me. I can look at it for hours!                                                 
工作好有意思耶! 尤其是看着别人工作
quel interessant travail!surtout quand je regarde les autres qui travaillent.
 

God made relatives; Thank God we can choose our friends.                                           
神决定了谁是你的亲戚, 幸运的是在选择朋友方面他给了你留了余地
le Dieu decide la relation,mais remercie le Dieu,on peut choisir ses amis.

阅读全文...

2005年11月6日星期日

About:从类型"DBNull"到类型"String"的强制转换无效

    Sub UpdateTextBoxes()
        Text_name.Text = CStr(dt.Rows(rowIndex)("用户姓名"))

    End Sub

数据库中取出一个字段,字段内容为NULL,VB.net总是报错:“从类型"DBNull"到类型"String"的强制转换无效”。 前天搞了我一下午,终于搞定,加一个判断语句就OK:

    Sub UpdateTextBoxes()
        If Not dt.Rows(rowIndex)("用户姓名").GetType Is System.DBNull.Value.GetType Then
            Text_name.Text = CStr(dt.Rows(rowIndex)("用户姓名"))
        End If
    End Sub

阅读全文...