犬者
“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”

【电脑】夸张的认证管理

开始做一个系统……一套也许不会有人去用的系统……但是,偶却尽情的玩着各种技术,进度非常缓慢……本来,今天晚上要做完的……但是,现在去只是做完一个登陆界面而已……

几乎所有的系统都有会员注册……一直都很想做一套很牛X的会员注册系统出来……

首先,一般人都很喜欢在所有的地方使用同一个密码,这样子是不好的……一旦有任何地方的密码泄露,结果就是全线奔溃……所以,密码不应该是由用户输入,而应该让系统自动生成……

花了一点功夫,偶写了如下VB.Net代码:

Dim i, j As Integer
Dim r As New Random
Dim password As String
j = r.Next(8,16) '随机产生一个8到16之间的数字 Dim pp(j) As Char '生成相应大小的数组
For i = 0 To j pp(i) = ChrW(r.Next(65, 90)) '随机生成大写字母字符放到数组里面 Next password = pp '字符数组可以直接赋值给字符串,系统自动完成隐性类型转换

有点讨厌ASCII code,65到90代表'A'到'Z',但是91到96代表的却是一些符号,97到122才是'a'到'z'……数字0-9则是用48到57代表。

大小些字母跟数字的取值被分成了三段。上面的算法只是大写字母的赋值范围里面生成随机数字,也就是说生成的密码会是由8到16个大写字母组成……稍微修改一下算法,也是可以生成大小写字母跟数字组成的随机密码,但是太麻烦了……而且,上面的算法已经可以生成:
26^16-26^7=43608742899420842249600
个不同的密码,密码强度应该是符合任何场合使用了。

然后,又有一个问题,倘若用户很喜欢这个随机生成的密码,拿到别的可以直接指定密码的地方用,一但系统数据泄漏,用户在其他地方的帐号不也跟着完蛋么?

所以,随机生成的这个密码还不可以明文保存在服务器上,必须使用不可逆算法进行加密,比方说md5。

写了如下VB.Net代码:

Dim md5 As New System.Security.Cryptography.MD5CryptoServiceProvider
Dim data() As Byte
Dim newpass As Byte()  '注意data跟newpass的声明方式
data = System.Text.Encoding.Unicode.GetBytes(password.ToCharArray)
'注意,必须使用Unicode.GetBytes,只有Unicode才能够完整的将数组装换为字符! newpass = md5.ComputeHash(data) 'newpass就是经过md5加密之后的随机密码

.Net Framework提供的md5类库,生成的是16bit的binary数组。一共有
2^64=18446744073709551616 种组合。暴力破解可能性颇低。

系统的安全性应该是好了……但是,作为一套完善的系统,必须保证与用户的联系,至少,要有可以联系得到用户的email,也就是说,用户完成注册之后,必须发送一份确认信到用户填写的email帐号里面,并且在信里面提供一个连接,让用户访问该连接之后,系统才激活用户的帐号。这个连接必须是系统自动生成,并且是用户无法推算得到的,否则,像我这样的用户,依然会填写假的email地址,然后根据我推算出来的连接,激活自己的帐号。

什么东西是用户无法推算得到的呢?我们自然可以再随机生成一个新的“激活码”,但是,这样子做有一个缺点,数据库必须保留“激活码”这个数据,尽管这个数据只是使用一次。用户的密码已经是系统随机生成的,我们完全可以对这个密码进行处理,生成一个用户无法“推算”的连接。

newpass这个数组是保存在数据库里面的,读出来后,可以使用
Encoding.Unicode.GetString(newpass)将其转换回String。
我们是否可以将这个String放到连接里面呢?

不可以!

这个String是Unicode的,可能是任何字符,而浏览器在发送URL的时候,会对地址进行处理,比方说,将空格转换为 %20这样的东西……事实上,在使用带有简体中文,也就是GB2312编码的URL时,都往往会发生错误,Unicode的URL,简直就是不可以想象的……在多数情况下,浏览器都会给出“Invalide URL”这样的错误。

在VB.Net里面,String这个类是带有GetHashcode这个method的,任何一个字符串经过系统内置的散列算法算出一个正整数(Java也是类似),在URL里面使用数字是完全不会有问题的。

而且,GetHashCode给出来的是数字!我们完全可以用各种用户无法推测的算法对这个数字进行变换,即使只是简单的加减乘除,即使用户有庞大取样,推系统所生成的URL的被其他人推算出来的可能性极低!

偶做的系统激活帐号的URL类似于:
activate.aspx?user=Wuvist&pass=1018421357

后面1018421357这个数字,有谁能够推算得出来呢?

破解这样的加密算法难度不亚于攻击服务器,直接获取URL生成,帐号激活的程序。

但是,系统还是无懈可击的。ASP.Net不是ASP,ASP.Net的程序必须经过编译才能运行,即使服务器被攻击了,黑客也只能获取编译过后的程序,一个dll文件而已……据我所知,到目前为止,尚无反编译.Net程序的软件出现。

这样的认证管理,真的很夸张……我还居然把它做出来了……其实,很多网站都已经采用了这样的用户认证方式……不过……自己做的东西,感觉还是比较好的说……

1122
问天 @3/4/2004 5:20:49 AM
View blogs in this category:电脑


ktz 在 3/4/2004 11:14:04 AM 说:

你好神奇啊
acylation 在 3/4/2004 11:02:36 AM 说:

最幸福的事就是做自己喜欢做的事:D 挺强的VB.NET

Please leave your comment here

 
  名字:
  主页:
  内容:
 

   


Navigation
Blogwind
犬者首页
Contact


个人档案


“说了你又不听,听又不懂,懂又不做,做又做错,错又不认,认又不改,改又不服,不服也不说,那叫我怎么办?!”



Categories
死结(27)
电脑(171)
心情(175)
天影(25)
乱弹(204)
博客(80)
音乐(18)
饕餮(30)
读书(19)
电影(27)
网摘(5)
希望(31)
汕头(10)
经济(5)
苹果(19)
跋涉(3)



Archive
2008年8月
2008年7月
2008年6月
2008年5月
2008年4月
2008年3月
2008年2月
2008年1月
2007年12月
2007年11月
2007年10月
2007年9月
2007年8月
2007年7月
2007年6月
2007年5月
2007年4月
2007年3月
2007年2月
2007年1月
2006年12月
2006年11月
2006年10月
2006年9月
2006年8月
2006年7月
2006年6月
2006年5月
2006年4月
2006年3月
2006年2月
2006年1月
2005年12月
2005年11月
2005年10月
2005年9月
2005年8月
2005年7月
2005年6月
2005年5月
2005年4月
2005年3月
2005年2月
2005年1月
2004年12月
2004年11月
2004年10月
2004年9月
2004年8月
2004年7月
2004年6月
2004年5月
2004年4月
2004年3月
2004年2月
2004年1月
2003年12月



My Links
5G
bloglines
时尚摄影师奇科的博客
我们的漫画
颜如玉
最爱卫斯理

RSS 2.0

Username:
Password:
 Remember me