您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页java-MD5开发教程

java-MD5开发教程

来源:五一七教育网
javabean:MD5的Java Bean实现

疯狂代码 http://www.crazycoder.cn/ ĵ:http:/www.crazycoder.cn/Java/Article47426.html   MD5介绍

  MD5全称是Message-Digest Algorithm 5在90年代初由MIT计算机科学实验室和RSA Data SecurityInc发明经MD2、MD3和MD4发展而来

  Message-Digest泛指字节串(Message)Hash变换就是把个任意长度字节串变换成定长大整数请注意我使用了“字节串”而不是“串”这个词是这种变换只和字节值有关和集或编码方式无关

  MD5将任意长度“字节串”变换成个128bit大整数并且它是个不可逆串变换算法换句话说就是即使你看到源和算法描述也无法将个MD5值变换回原始串从数学原理上说是原始串有无穷多个这有点象不存在反数学

  MD5典型应用是对段Message(字节串)产生fingerpr(指纹)以防止被“篡改”举个例子你将段话写在个叫readme.txt文件中并对这个readme.txt产生个MD5值并记录在案然后你可以传播这个文件给别人别人如果修改了文件中任何内容你对这个文件重新计算MD5时就会发现如果再有个第 3方认证机构用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提供了这些基本组件但很多应用开发者为了管理更大灵活性还是喜欢采用关系数据库来管理用户懒惰做法是用户密码往往使用明文或简单变换后直接保存在数据库中因此这些用户密码对软件Software开发者或系统管理员来说可以说毫无保密可言本文目是介绍MD5Java Bean实现同时给出用MD5来处理用户Account密码例子这种思路方法使得管理员和设计者都无法看到用户密码尽管他们可以化它们但重要点是对于用户密码设置习惯保护

  有兴趣读者可以从这里取得MD5也就是RFC 1321文本http://www.ietf.org/rfc/rfc1321.txt

  实现策略

  MD5算法在RFC1321中实际上已经提供了C实现我们其实马上就能想到至少有两种用Java实现它思路方法第种是用Java语言重新写整个算法或者再说简单点就是把C改写成Java第 2种是用JNI(Java Native Interface)来实现核心算法仍然用这个C用Java类给它包个壳

  但我个人认为JNI应该是Java为了解决某类问题时没有办法办法(比如和操作系统或I/O设备密切相关应用)同时为了提供和其它语言互操作性个手段使用JNI带来最大问题是引入了平台依赖性打破了SUN所鼓吹“次编写到处运行”Java好处因此我决定采取第种思路方法来和大家起尝试下“次编写到处运行”好处 2来检验下Java 2现在对于比较密集计算效率问题

  实现过程

  限于这篇文章篇幅同时也为了更多读者能够真正专注于问题本身我不想就某种Java集成开发环境来介绍这个Java Bean制作过程介绍个思路方法时我发现步骤和命令很清晰我相信有任何种Java集成环境 3天以上经验读者都会知道如何把这些代码在集成环境中编译和运行用集成环境讲述问题往往需要配很多屏幕截图这也是我直对集成环境很头疼原因我使用了个普通文本编辑器同时使用了Sun公司标准JDK 1.3.0 for Windows NT

  其实把C转换成Java对于个有定C语言基础员并不困难这两个语言基本语法几乎完全致.我大概花了个小时时间完成了代码转换工作我主要作了下面几件事:

  把必须使用些#宏定义变成Class中final 这样保证在个进程空间中多个Instance共享这些数据

  删去了些无用# 我只关心MD5这个推荐C实现同时实现了MD2 MD3和 MD4而且有些# 还和C区别编译器有关

  将些计算宏转换成final 成员

  所有变量命名和原来C实现中保持致在大小写上作些符合Java习惯变化计算过程中C变成了private思路方法(成员)

  关键变量位长调整

  定义了类和思路方法

  需要注意是很多早期C编译器类型是16 bitMD5使用了unsigned long 并认为它是32bit无符号整数而在Java中是32 bitlong是 bit在MD5C实现中使用了大量位操作这里需要指出点是尽管Java提供了位操作由于Java没有unsigned类型对于右移位操作多提供了个无符号右移:>>>等价于C中 >> 对于unsigned 数处理

  Java不提供无符号数运算两个大数相加就会溢出得到个负数或异常因此我将些关键变量在Java中改成了long类型(bit)我个人认为这比自己去重新定义组无符号数类同时重载那些运算符要方便同时效率高很多并且代码也易读OO(Object Oriented)滥用反而会导致效率低下

  限于篇幅这里不再给出原始C代码有兴趣对照读者朋友可以去看RFC 1321MD5.java源代码

  测试

  在RFC 1321中给出了Test suite用来检验你实现是否正确:

MD5 (\"\") = d41d8cd98f00b204e9800998ecf8427e MD5 (\"a\") = 0cc175b9c0f1b6a831c399e269772661 MD5 (\"abc\") = 900150983cd24fb0d6963f7d28e17f72

MD5 (\"message digest\") = f96b697d7cb7938d525a2f31aaf161d0

MD5 (\"abcdefghijklmnopqrstuvwxyz\") = c3fcd3d76192e4007dfb496cca67e13b

……  这些输出结果含义是指:空串””MD5值是d41d8cd98f00b204e9800998ecf8427e串”a”MD5值是0cc175b9c0f1b6a831c399e269772661……

  编译并运行我们:

javac –d . MD5.java

java beartool.MD5  为了将来不和别人同名冲突我在我第行使用了package beartool;

  因此编译命令javac –d . MD5.java 命令在我们工作目录下自动建立了个beartool目录目录下放着编译成功MD5.

  我们将得到和Test suite同样结果当然还可以继续测试你感兴趣其它MD5变换例如:

  java beartool.MD5 1234

  将给出1234MD5值

  可能是我计算机知识是从Apple II和Z80单板机开始我对大写十 6进制代码有偏好如果您想使用小写DigestString只需要把HEX中A、B、C、D、E、F改成a、b、 c、d、e、f就可以了

  MD5据称是种比较耗时计算我们Java版MD5闪就算出来了没遇到什么障碍而且用肉眼感觉不出来Java版MD5比C版慢

  为了测试它兼容性我把这个MD5.文件拷贝到我另台Linux+IBM JDK 1.3机器上执行后得到同样结果确实是“次编写到处运行了”

  Java Bean简述

  现在我们已经完成并简单测试了这个Java Class我们文章标题是做个Java Bean

  其实普通Java Bean很简单并不是什么全新或伟大概念就是个JavaClass尽管 Sun规定了些需要实现思路方法但并不是强制而EJB(Enterprise Java Bean)无非规定了些必须实现(非常类似于响应事件)思路方法这些思路方法是供EJB Container使用()

  在个Java Application或Applet里使用这个bean非常简单最简单思路方法是你要使用这个类源码工作目录下建个beartool目录把这个文件拷贝进去然后在你中import beartool.MD5就可以了最后打包成.jar或.war是保持这个相对目录关系就行了

2009-1-8 2:26:04

疯狂代码 http://www.crazycoder.cn/

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务