|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。MD5简介
MD5的全称是Message-DigestAlgorithm5,在90年月初由MIT的盘算机迷信实行室和RSADataSecurityInc创造,经MD2、MD3和MD4开展而来。Message-Digest泛指字节串(Message)的Hash变更,就是把一个恣意长度的字节串变更成必定长的年夜整数。请注重我利用了“字节串”而不是“字符串”这个词,是由于这类变更只与字节的值有关,与字符集或编码体例有关。
MD5将恣意长度的“字节串”变更成一个128bit的年夜整数,而且它是一个不成逆的字符串变更算法,换句话说就是,即便你看到源程序和算法形貌,也没法将一个MD5的值变更回原始的字符串,从数学道理上说,是由于原始的字符串有没有穷多个,这有点象不存在反函数的数学函数。
MD5的典范使用是对一段Message(字节串)发生fingerprint(指纹),以避免被“改动”。举个例子,你将一段话写在一个叫readme.txt文件中,并对这个readme.txt发生一个MD5的值并纪录在案,然后你能够传布这个文件给他人,他人假如修正了文件中的任何内容,你对这个文件从头盘算MD5时就会发明。假如再有一个第三方的认证机构,用MD5还能够避免文件作者的“承认”,这就是所谓的数字署名使用。
MD5还普遍用于加密息争密手艺上,在良多操纵体系中,用户的暗码是以MD5值(或相似的别的算法)的体例保留的,用户Login的时分,体系是把用户输出的暗码盘算成MD5值,然后再往和体系中保留的MD5值举行对照,而体系其实不“晓得”用户的暗码是甚么。
一些黑客破获这类暗码的办法是一种被称为“跑字典”的办法。有两种办法失掉字典,一种是一样平常汇集的用做暗码的字符串表,另外一种是用分列组合办法天生的,先用MD5程序盘算出这些字典项的MD5值,然后再用方针的MD5值在这个字典中检索。
即便假定暗码的最年夜长度为8,同时暗码只能是字母和数字,共26+26+10=62个字符,分列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),那也已是一个很地理的数字了,存储这个字典就必要TB级的磁盘组,并且这类办法另有一个条件,就是能取得方针账户的暗码MD5值的情形下才能够。
在良多电子商务和社区使用中,办理用户的Account是一种最经常使用的基础功效,只管良多ApplicationServer供应了这些基础组件,但良多使用开辟者为了办理的更年夜的天真性仍是喜好接纳干系数据库来办理用户,怠惰的做法是用户的暗码常常利用明文或复杂的变更后间接保留在数据库中,因而这些用户的暗码对软件开辟者或体系办理员来讲能够说毫无保密可言,本文的目标是先容MD5的JavaBean的完成,同时给出用MD5来处置用户的Account暗码的例子,这类办法使得办理员和程序计划者都没法看到用户的暗码,只管他们能够初始化它们。但主要的一点是关于用户暗码设置习气的回护。
有乐趣的读者能够从这里获得MD5也就是RFC1321的文本。http://www.ietf.org/rfc/rfc1321.txt
完成战略
MD5的算法在RFC1321中实践上已供应了C的完成,我们实在即刻就可以想到,最少有两种用Java完成它的办法,第一种是,用Java言语从头写全部算法,大概再说复杂点就是把C程序改写成Java程序。第二种是,用JNI(JavaNativeInterface)来完成,中心算法仍旧用这个C程序,用Java类给它包个壳。
但我团体以为,JNI应当是Java为懂得决某类成绩时的没有举措的举措(好比与操纵体系或I/O设备亲切相干的使用),同时为了供应和别的言语的互操纵性的一个手腕。利用JNI带来的最年夜成绩是引进了平台的依附性,冲破了SUN所宣传的“一次编写各处运转”的Java优点。因而,我决意接纳第一种办法,一来和人人一同实验一下“一次编写各处运转”的优点,二来查验一下Java2如今关于对照麋集的盘算的效力成绩。
完成历程
限于这篇文章的篇幅,同时也为了更多的读者可以真正专注于成绩自己,我不想就某一种Java集成开辟情况来先容这个JavaBean的制造历程,先容一个办法时我发明步骤和命令很明晰,我信任有任何一种Java集成情况三天以上履历的读者城市晓得怎样把这些代码在集成情况中编译和运转。用集成情况报告成绩常常必要配良多屏幕截图,这也是我一向对集成情况很头疼的缘故原由。我利用了一个一般的文本编纂器,同时利用了Sun公司尺度的JDK1.3.0forWindowsNT。
实在把C转换成Java关于一个有必定C言语基本的程序员其实不坚苦,这两个言语的基础语法几近完整分歧.我也许花了一个小时的工夫完成了代码的转换事情,我次要作了上面几件事:
把必需利用的一些#define的宏界说酿成Class中的finalstatic,如许包管在一个历程空间中的多个Instance共享这些数据删往了一些无用的#ifdefine,由于我只体贴MD5,这个保举的C完成同时完成了MD2MD3和MD4,并且有些#ifdefine还和C分歧编译器有关将一些盘算宏转换成finalstatic成员函数。
一切的变量定名与本来C完成中坚持分歧,在巨细写上作一些切合Java习气的变更,盘算过程当中的C函数酿成了private办法(成员函数)。
关头变量的位长调剂界说了类和办法必要注重的是,良多初期的C编译器的int范例是16bit的,MD5利用了unsignedlongint,并以为它是32bit的无标记整数。而在Java中int是32bit的,long是64bit的。在MD5的C完成中,利用了大批的位操纵。这里必要指出的一点是,只管Java供应了位操纵,因为Java没有unsigned范例,关于右移位操纵多供应了一个无标记右移:>>>,等价于C中的>>关于unsigned数的处置。
由于Java不供应无标记数的运算,两个年夜int数相加就会溢出失掉一个正数或非常,因而我将一些关头变量在Java中改成了long范例(64bit)。我团体以为这比本人往从头界说一组无标记数的类同时重载那些运算符要便利,同时效力高良多而且代码也易读,OO(ObjectOriented)的滥用反而会招致效力低下。
限于篇幅,这里不再给出原始的C代码,有乐趣对比的读者伴侣能够往看RFC1321。MD5.java源代码
测试
在RFC1321中,给出了Testsuite用来查验你的完成是不是准确:
MD5("")=d41d8cd98f00b204e9800998ecf8427e
MD5("a")=0cc175b9c0f1b6a831c399e269772661
MD5("abc")=900150983cd24fb0d6963f7d28e17f72
MD5("messagedigest")=f96b697d7cb7938d525a2f31aaf161d0
MD5("abcdefghijklmnopqrstuvwxyz")=c3fcd3d76192e4007dfb496cca67e13b
……
这些输入了局的寄义是指:空字符串””的MD5值是d41d8cd98f00b204e9800998ecf8427e,字符串”a”的MD5值是0cc175b9c0f1b6a831c399e269772661……
编译并运转我们的程序:
javacCd.MD5.java
javabeartool.MD5
为了未来不与他人的同名程序抵触,我在我的程序的第一利用用了packagebeartool;
因而编译命令javacCd.MD5.java命令在我们的事情目次下主动创建了一个beartool目次,目次下放着编译乐成的MD5.class
我们将失掉和Testsuite一样的了局。固然还能够持续测试你感乐趣的别的MD5变更,比方:
javabeartool.MD5 1234
将给出1234的MD5值。
多是我的盘算机常识是从AppleII和Z80单板机入手下手的,我对年夜写十六进制代码有偏好,假如您想利用小写的DigestString只必要把byteHEX函数中的A、B、C、D、E、F改成a、b、c、d、e、f就能够了。
MD5据称是一种对照耗时的盘算,我们的Java版MD5一闪就算出来了,没碰到甚么停滞,并且用肉眼感到不出来Java版的MD5比C版的慢。
为了测试它的兼容性,我把这个MD5.class文件拷贝到我的另外一台Linux+IBMJDK1.3的呆板上,实行后失掉一样了局,的确是“一次编写各处运转了”。
[1][2][3]下一页
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。 |
|