起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6460|回复: 13

[分享] Java MD5加密代码

[复制链接]

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
发表于 2016-9-30 10:04:12 | 显示全部楼层 |阅读模式
  • import java.security.MessageDigest;  
  • public class MD5Util {  
  •     public final static String MD5(String s) {  
  •         char hexDigits[] = { '0', '1', '2', '3', '4',  
  •                              '5', '6', '7', '8', '9',  
  •                              'A', 'B', 'C', 'D', 'E', 'F' };  
  •         try {  
  •             byte[] btInput = s.getBytes();  
  •      //获得MD5摘要算法的 MessageDigest 对象  
  •             MessageDigest mdInst = MessageDigest.getInstance("MD5");  
  •      //使用指定的字节更新摘要  
  •             mdInst.update(btInput);  
  •      //获得密文  
  •             byte[] md = mdInst.digest();  
  •      //把密文转换成十六进制的字符串形式  
  •             int j = md.length;  
  •             char str[] = new char[j * 2];  
  •             int k = 0;  
  •             for (int i = 0; i < j; i++) {  
  •                 byte byte0 = md;  
  •                 str[k++] = hexDigits[byte0 >>> 4 & 0xf];  
  •                 str[k++] = hexDigits[byte0 & 0xf];  
  •             }  
  •             return new String(str);  
  •         }  
  •         catch (Exception e) {  
  •             e.printStackTrace();  
  •             return null;  
  •         }  
  •     }  
  •     public static void main(String[] args) {  
  •         System.out.print(MD5Util.MD5("password"));  
  •     }  
  • }  

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 10:10:57 | 显示全部楼层
strOut[k++] = hexDigits[byte0 >>> 4 & 0xf]; 其中>>>运算符什么意思?

这里long型数据右移时使用无符号右移运算符>>>
java里面的
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 10:30:24 | 显示全部楼层
java MD5 16位 加密字符串标准算法

首先先了解md5加密算法的原理,太高深太专业的说法,我不会,就算会说了也可能大家不明白

原理:将存储字符串的bit(1byte = 8bit)顺序打乱,然后重组,抽取32位byte,每2个再进行组合,形成16组byte[]数组,然后在依次转化为16进制。  这就是16位的MD5加密算法,具体算法如下:

public static String getMD5(byte[] source) {
  String s = null;
  char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
    'e', 'f' };
  try {
   java.security.MessageDigest md = java.security.MessageDigest
     .getInstance("MD5");
   md.update(source);
   byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
   // 用字节表示就是 16 个字节
   char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
   // 所以表示成 16 进制需要 32 个字符
   int k = 0; // 表示转换结果中对应的字符位置
   for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
    // 转换成 16 进制字符的转换
    byte byte0 = tmp[i]; // 取第 i 个字节
    str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
    // >>> 为逻辑右移,将符号位一起右移
    str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
   }
   s = new String(str); // 换后的结果转换为字符串
  } catch (Exception e) {
   e.printStackTrace();
  }
  return s;
}


有时候我们需要用到byte[16]....byte[0] = '0 x b[0]+b[1]'  --这不是代码是一个形象的比如
修改如下:
public static byte[] getMD5Byte(byte[] source) {
  byte[] b = new byte[16];
  char hexDigits[] = {
  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
    'e', 'f' };
  
  try {
   java.security.MessageDigest md = java.security.MessageDigest
     .getInstance("MD5");
   md.update(source);
   byte tmp[] = md.digest();
   char str[] = new char[16 * 2];
   int k = 0;
   for (int i = 0; i < 16; i++) {   
    byte byte0 = tmp[i];
    str[k++] = hexDigits[byte0 >>> 4 & 0xf];
    str[k++] = hexDigits[byte0 & 0xf];
    int a = Integer.parseInt((str[k-2]+""+str[k-1]).toString(),16);
    b[i] = (byte)a;
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return b;
}
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 10:41:15 | 显示全部楼层
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 10:51:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 10:54:43 | 显示全部楼层
import sun.misc.BASE64Encoder;
import java.security.*;
public class MD5{
   public static void main(String rsg[])throws Exception{
         String username="sa";
         String password="sa";     
         MessageDigest md5=MessageDigest.getInstance("MD5");
         BASE64Encoder base64en = new BASE64Encoder();
         password=base64en.encode(md5.digest(password.getBytes("utf-8")));
         System.out.println(password);
   }
}   

System.out.println(java.util.Arrays.toString(md5.digest(password.getBytes("utf-8"))));
它的输出结果是:[-63, 46, 1, -14, -95, 63, -11, 88, 126, 30, -98, 74, -19, -72, 36, 45]
这是一个字节数组,BASE64的作用就是把这个字节数组转化成字符串,存取更方便。
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 11:02:02 | 显示全部楼层
public class MD5Util {  
    private static final String encryModel="MD5";  
    /**
     * 32λmd5.
     * 32位小写md5加密
     * @param str
     * @return
     */  
    public  static String md5(String str) {  
        return encrypt(encryModel, str);  
    }  
    public static String encrypt(String algorithm, String str) {  
        try {  
            MessageDigest md = MessageDigest.getInstance(algorithm);  
            md.update(str.getBytes());  
            StringBuffer sb = new StringBuffer();  
            byte[] bytes = md.digest();  
            for (int i = 0; i < bytes.length; i++) {  
                int b = bytes[i] & 0xFF;  
                if (b < 0x10) {  
                    sb.append('0');  
                }  
                sb.append(Integer.toHexString(b));  
            }  
            return sb.toString();  
        } catch (Exception e) {  
            return "";  
        }  
    }  
}  
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 11:10:15 | 显示全部楼层
package com.chinasoft.corpinfosys.common;  
  
import java.security.MessageDigest;  
import java.security.NoSuchAlgorithmException;  
/**
* 功能简介:MD5加密工具类
* 密码等安全信息存入数据库时,转换成MD5加密形式
* @author  
*  
*
*/  
public class MD5Util  
{  
    public static String getMd5(String inStr)  
    {  
        String outStr=null;  
        if(inStr ==null)  
        {  
            outStr = null;  
        }  
        else if("".equals(inStr))  
        {  
            outStr = "";  
        }  
        else  
        {  
            try  
            {  
                MessageDigest md = MessageDigest.getInstance("MD5");  
                md.update(inStr.getBytes());  
                byte b[] = md.digest();  
                StringBuffer buf = new StringBuffer();  
                for(int i=1;i<b.length;i++)  
                {  
                    int c = b[i]>>>4 & 0xf;  
                    buf.append(Integer.toHexString(c));  
                    c = b[i]& 0xf;  
                    buf.append(Integer.toHexString(c));  
                }  
                outStr = buf.toString();  
            }  
            catch (NoSuchAlgorithmException e)  
            {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
        return outStr;  
    }  
  
}  
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 11:13:51 | 显示全部楼层
今天朱基亮问如何在java中进行md5加密,我查了一下资料,整理了一下,

写了一个类,大家可以直接使用.如果想了解一下md5的源码,可以参看

网上的资料,java中提供了专门的md5工具类,使用是非常简单的。


package com.tsinghua;

import java.security.*;


public class MD5Tool {


public static void main(String []args){
  
  
    String test="123";
  
    //创建一个MD5Tool类
    MD5Tool myMd5 =new MD5Tool();
  
    String result=myMd5.MD5Encrypt(test);
  
    System.out.println (test+" 加密後的结果是:"+result);
  
}

//该方法将你输入的字符串,通过md5加密,返回一个加密後的字符串
public static String MD5Encrypt(String inStr) {  
  
    MessageDigest md = null;  
    String outStr = null;  
    try {   

     md = MessageDigest.getInstance("MD5");         //可以选中其他的算法如SHA   
     byte[] digest = md.digest(inStr.getBytes());      
     //返回的是byet[],要转化为String存储比较方便  
     outStr = bytetoString(digest);  
    }
    catch (NoSuchAlgorithmException nsae) {   
     nsae.printStackTrace();  
    }  
    return outStr;
}

public static String bytetoString(byte[] digest) {  

    String str = "";  
    String tempStr = "";  
    for (int i = 1; i < digest.length; i++) {   
     tempStr = (Integer.toHexString(digest[i] & 0xff));   
     if (tempStr.length() == 1) {   
      str = str + "0" + tempStr;   
     }
     else {   
      str = str + tempStr;   
     }  
    }  
    return str.toLowerCase();

}
}
回复 支持 反对

使用道具 举报

90

主题

703

帖子

1026

积分

金牌会员

Rank: 6Rank: 6

积分
1026
QQ
 楼主| 发表于 2016-9-30 11:15:47 | 显示全部楼层
java的MD5加密和javascript的MD5加密结果不一致
http://bbs.wex5.com/forum.php?mod=viewthread&tid=75944
(出处: 起步软件技术论坛)


我是在We下做的。能引用Be下面的这个jar并且使用吗

wex5中平台没有提供md5加密
需要自己用java标准的

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-6-18 09:10 , Processed in 0.078738 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表