MD5的Java Bean实现[Java编程]
本文“MD5的Java Bean实现[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
MD5简介
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实行室和RSA Data Security Inc创造,经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是一种最常用的基本功效,固然很多Application Server供应了这些基本组件,但很多利用开辟者为了管理的更大的机动性还是喜好采取关系数据库来管理用户,怠惰的做法是用户的密码常常利用明文或简单的变更后直接保存在数据库中,因此这些用户的密码对软件开辟者或系统管理员来说可以说毫无保密可言,本文的目的是介绍MD5的Java Bean的实现,同时给出用MD5来处理用户的Account密码的例子,这种办法使得管理员和程序计划者都无法看到用户的密码,固然他们可以初始化它们.但重要的一点是关于用户密码设置习惯的保护.
有爱好的读者可以从这里获得MD5也就是RFC 1321的文本.http://www.ietf.org/rfc/rfc1321.txt
实现战略
MD5的算法在RFC1321中实际上已经供应了C的实现,我们其实即刻就可以想到,至少有两种用Java实现它的办法,第一种是,用Java语言重新写整个算法,大概再说简单点就是把C程序改写成Java程序.第二种是,用JNI(Java Native Interface)来实现,核心算法仍旧用这个C程序,用Java类给它包个壳.
但我个人认为,JNI应当是Java为了办理某类问题时的没有办法的办法(比方与操作系统或I/O设备密切相关的利用),同时为了供应和别的语言的互操作性的一个手段.利用JNI带来的最大问题是引入了平台的依靠性,冲破了SUN所宣扬的“一次编写处处运行”的Java好处.因此,我决意采纳第一种办法,一来和大家一同尝试一下“一次编写处处运行”的好处,二来查验一下Java 2目前关于对比密集的计算的效率问题.
实现历程
限于这篇文章的篇幅,同时也为了更多的读者可以真正专注于问题本身,我不想就某一种Java集成开辟环境来介绍这个Java Bean的制作历程,介绍一个办法时我发现步骤和号令很清楚,我相信有任何一种Java集成环境三天以上经验的读者城市知道若何把这些代码在集成环境中编译和运行.用集成环境报告问题常常需求配很多屏幕截图,这也是我一向对集成环境很头疼的缘由.我利用了一个普通的文本编辑器,同时利用了Sun公司尺度的JDK 1.3.0 for Windows NT.
其实把C转换成Java关于一个有一定C语言底子的程序员并不艰难,这两个语言的基本语法几近完好一致.我大约花了一个小时的时间完成了代码的转换工作,我主要作了下面几件事:
把必须利用的一些#define的宏定义变成Class中的final static,这样保证在一个进程空间中的多个Instance同享这些数据
删去了一些无用的#if define,因为我只关心MD5,这个举荐的C实现同时实现了MD2 MD3和 MD4,并且有些#if define还和C差别编译器有关
将一些计算宏转换成final static 成员函数.
全部的变量命名与本来C实现中保持一致,在大小写上作一些符合Java习惯的改变,计算历程中的C函数变成了private办法(成员函数).
关键变量的位长调整
定义了类和办法
需求注意的是,很多早期的C编译器的int范例是16 bit的,MD5利用了unsigned long int,并认为它是32bit的无标记整数.而在Java中int是32 bit的,long是64 bit的.在MD5的C实现中,利用了大量的位操作.这里需求指出的一点是,固然Java供应了位操作,由于Java没有unsigned范例,关于右移位操作多供应了一个无标记右移:>>>,等价于C中的 >> 关于unsigned 数的处理.
因为Java不供应无标记数的运算,两个大int数相加就会溢出得到一个负数或非常,因此我将一些关键变量在Java中改成了long范例(64bit).我个人认为这比自己去重新定义一组无标记数的类同时重载那些运算符要便利,同时效率高很多并且代码也易读,OO(Object Oriented)的滥用反而会招致效率低下.
限于篇幅,这里不再给出原始的C代码,有爱好对比的读者朋友可以去看RFC 1321.MD5.java源代码
以上是“MD5的Java Bean实现[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |