Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167144
  • 博文数量: 16
  • 博客积分: 473
  • 博客等级: 二等列兵
  • 技术积分: 152
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-07 12:58
文章分类

全部博文(16)

文章存档

2012年(8)

2011年(8)

分类: Java

2011-12-12 13:27:24

学期末做项目需要MD5加密用户密码,在网上找了很多资料,经过修改、加注释,现在把源码贴上来。
  1. package org.liushang.util;



  2. import java.io.UnsupportedEncodingException;

  3. import java.security.MessageDigest;

  4. import java.security.NoSuchAlgorithmException;



  5. /**

  6.  * 32位MD5加密,验证

  7.  * @author liushang

  8.  *

  9.  */

  10. public class MD5 {

  11.     

  12.     /**

  13.      * 将指定的字符串用MD5加密

  14.      * @param originstr 需要加密的字符串

  15.      * @return 加密后的字符串

  16.      */

  17.     public String ecodeByMD5(String originstr){

  18.         String result = null;

  19.         char hexDigits[] = {//用来将字节转换成 16 进制表示的字符

  20.              '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

  21.         if(originstr != null){

  22.             try {

  23.                 //返回实现指定摘要算法的 MessageDigest 对象

  24.                 MessageDigest md = MessageDigest.getInstance("MD5");

  25.     

  26.                 //使用utf-8编码将originstr字符串编码并保存到source字节数组

  27.                 byte[] source = originstr.getBytes("utf-8");

  28.                 //使用指定的 byte 数组更新摘要

  29.                 md.update(source);

  30.                 //通过执行诸如填充之类的最终操作完成哈希计算,结果是一个128位的长整数

  31.                 byte[] tmp = md.digest();

  32.                 //用16进制数表示需要32位

  33.                 char[] str = new char[32];

  34.                 for(int i=0,j=0; i < 16; i++){

  35.                     //j表示转换结果中对应的字符位置

  36.                     //从第一个字节开始,对 MD5 的每一个字节

  37.                     //转换成 16 进制字符

  38.                     byte b = tmp[i];

  39.                     //取字节中高 4 位的数字转换

  40.                     //无符号右移运算符>>> ,它总是在左边补0

  41.                     //0x代表它后面的是十六进制的数字. f转换成十进制就是15

  42.                     str[j++] = hexDigits[b>>>4 & 0xf];

  43.                     // 取字节中低 4 位的数字转换

  44.                     str[j++] = hexDigits[b&0xf];

  45.                 }

  46.                 result = new String(str);//结果转换成字符串用于返回

  47.             } catch (NoSuchAlgorithmException e) {

  48.                 //当请求特定的加密算法而它在该环境中不可用时抛出此异常

  49.                 e.printStackTrace();

  50.             } catch (UnsupportedEncodingException e) {

  51.                 //不支持字符编码异常

  52.                 e.printStackTrace();

  53.             }

  54.         }

  55.         return result;

  56.     }

  57.     

  58.     //使用MD5检查密码

  59.     public boolean checkPWD(String typPWD, String relPWD){

  60.         if(ecodeByMD5(typPWD).equals(ecodeByMD5(relPWD))){

  61.             return true;

  62.         }

  63.         return false;

  64.     }

  65. }
其实java的MD5算法就算你瞪着眼睛看也搞不明白,如果想深究其原理就必须弄懂MD5的底层实现。
阅读(8912) | 评论(7) | 转发(2) |
给主人留下些什么吧!~~

winbber2011-12-23 16:18:45

cheungmine: 看我的文章:网站密码加密原理.....
密码还有这么多说法,我以为保存个密文也就行了~~

cheungmine2011-12-23 12:10:30

看我的文章:网站密码加密原理

winbber2011-12-22 19:04:32

cheungmine: 如果2个用户的密码是一样的,比如都是123,而加密的结果也是一样的,比如qazxsw,那么你这个方法就存在严重的漏洞。即用户A可以通过猜测加密后的值来推测B的密码.....
如果同一密码的加密结果不同,如何才能验证密码呢?

cheungmine2011-12-22 17:59:06

如果2个用户的密码是一样的,比如都是123,而加密的结果也是一样的,比如qazxsw,那么你这个方法就存在严重的漏洞。即用户A可以通过猜测加密后的值来推测B的密码。因此需要引入随机数的概念。

winbber2011-12-13 13:47:55

最乖啦啦: 瞪着眼睛看也搞不明bai.....
java不就是这样么,所以底层实现都封装好了。。。。