百度百科对MD5的说明是:

  Message Digest Algorithm MD5(中文名为消息摘要算法第 五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
  MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

  MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。

通常采用java提供的API实现的MD5加密程序如下所示:

 import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class Encryption1 {
public static final String MD5="MD5";
/**
* 采用加密算法加密字符串数据
* @param str 需要加密的数据
* @param algorithm 采用的加密算法
* @return 字节数据
*/
public static byte[] EncryptionStr(String str, String algorithm) {
// 加密之后所得字节数组
byte[] bytes = null;
try {
// 获取MD5算法实例 得到一个md5的消息摘要
MessageDigest md = MessageDigest.getInstance(algorithm);
//添加要进行计算摘要的信息
md.update(str.getBytes());
//得到该摘要
bytes = md.digest();
} catch (NoSuchAlgorithmException e) {
System.out.println("加密算法: "+ algorithm +" 不存在: ");
}
return null==bytes?null:bytes;
}
//测试上述方法
public static void main(String[] args) {
String test1="test1";
String test2="QWERFVDSCX";
String test3="23423KJHkdfg";
String [] test={test1,test2,test3};
for (String s : test) {
byte [] bytes=EncryptionStr(s,MD5);
System.out.println("数据:" + s+" 加密之后的结果为:"+bytes.toString()+" 字节数组长度为:"+bytes.length);
}
}
}

上述代码执行结果为:

 数据:test1 加密之后的结果为:[B@71881149 字节数组长度为:16
数据:QWERFVDSCX 加密之后的结果为:[B@1c2709da 字节数组长度为:16
数据:23423KJHkdfg 加密之后的结果为:[B@46f7d5a6 字节数组长度为:16

分析:字符串采用MD5加密之后返回的数据类型为字节数组(byte []),一个字节是8位(bit位),返回的数组长度是16,那么加密的字符串结果为16*8=128位,为固定长度的字节数组,除了MD5代码之外,上述代码中algorithm参数改成SHA-1 、SHA-256等加密算法也是支持的

  上述加密结果通常转成长度为32的字符串进行存储和传输,下面是程序代码:

 import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class Encryption2 {
public static final String MD5="MD5"; /**
* 采用加密算法加密字符串数据
* @param str 需要加密的数据
* @param algorithm 采用的加密算法
* @return 字节数据
*/
public static byte[] EncryptionStrBytes(String str, String algorithm) {
// 加密之后所得字节数组
byte[] bytes = null;
try {
// 获取MD5算法实例 得到一个md5的消息摘要
MessageDigest md = MessageDigest.getInstance(algorithm);
//添加要进行计算摘要的信息
md.update(str.getBytes());
//得到该摘要
bytes = md.digest();
} catch (NoSuchAlgorithmException e) {
System.out.println("加密算法: "+ algorithm +" 不存在: ");
}
return null==bytes?null:bytes;
} /**
* 把字节数组转化成字符串返回
* @param bytes
* @return
*/
public static String BytesConvertToHexString(byte [] bytes) {
StringBuffer sb = new StringBuffer();
for (byte aByte : bytes) {
String s=Integer.toHexString(0xff & aByte);
if(s.length()==1){
sb.append("0"+s);
}else{
sb.append(s);
}
}
return sb.toString();
} /**
* 采用加密算法加密字符串数据
* @param str 需要加密的数据
* @param algorithm 采用的加密算法
* @return 字节数据
*/
public static String EncryptionStr(String str, String algorithm) {
// 加密之后所得字节数组
byte[] bytes = EncryptionStrBytes(str,algorithm);
return BytesConvertToHexString(bytes);
}
//测试上述方法
public static void main(String[] args) {
String test1="test1";
String test2="QWERFVDSCX";
String test3="23423KJHkdfg";
String [] test={test1,test2,test3};
for (String s : test) {
String str=EncryptionStr(s,MD5);
System.out.println("数据:" + s+" 加密之后的结果为:"+str+" 字符串长度为:"+str.length());
}
}
}

上述代码执行结果为:

 数据:test1 加密之后的结果为:5a105e8b9d40e1329780d62ea2265d8a 字符串长度为:32
数据:QWERFVDSCX 加密之后的结果为:ce5b403e336fb819b48b08dbfd39fbf3 字符串长度为:32
数据:23423KJHkdfg 加密之后的结果为:6a91f81e7809f6f79c753a054543d128 字符串长度为:32

上述代码虽然实现了基本的数据加密功能,但是有人可能觉得32位字符串还是太长了,想改成16位或者其他长度;或者说java编码时工程统一使用UTF-8编码,对字符串编码格式进行指定等要求,下面是一种实现(功能可扩充点还有很多,比如说字符串数组加密,把加密之后的数据转成指定编码格式等)

 import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class Encryption3 {
public static final String MD5="MD5";
public static final String UTF8="UTF-8"; /**
* 采用加密算法加密字符串数据 转成长度为32的字符串
* @param str
* @param algorithm 采用的加密算法
* @param charset 指定转化之后的字符串编码
* @return
*/
public static String EncryptionStr32(String str, String algorithm,String charset) {
// 加密之后所得字节数组
byte[] bytes = EncryptionStrBytes(str,algorithm,charset);
return BytesConvertToHexString(bytes);
} /**
* 采用加密算法加密字符串数据 转成长度为32的字符串
* @param str 需要加密的数据
* @param algorithm 采用的加密算法
* @return 字节数据
*/
public static String EncryptionStr32(String str, String algorithm) {
return EncryptionStr32(str,algorithm,"");
} /**
* 采用加密算法加密字符串数据 转成长度为16的字符串
* @param str
* @param algorithm 采用的加密算法
* @param charset 指定转化之后的字符串编码
* @return
*/
public static String EncryptionStr16(String str, String algorithm,String charset) {
return EncryptionStr32(str,algorithm,charset).substring(8,24);
} /**
* 采用加密算法加密字符串数据 转成长度为16的字符串
* @param str 需要加密的数据
* @param algorithm 采用的加密算法
* @return 字节数据
*/
public static String EncryptionStr16(String str, String algorithm) {
return EncryptionStr32(str,algorithm,"").substring(8,24);
} /**
* 采用加密算法加密字符串数据
* @param str 需要加密的数据
* @param algorithm 采用的加密算法
* @param charset 指定转化之后的字符串编码
* @return 字节数据
*/
public static byte[] EncryptionStrBytes(String str, String algorithm, String charset) {
// 加密之后所得字节数组
byte[] bytes = null;
try {
// 获取MD5算法实例 得到一个md5的消息摘要
MessageDigest md = MessageDigest.getInstance(algorithm);
//添加要进行计算摘要的信息
if(null==charset||"".equals(charset)) {
md.update(str.getBytes());
}else{
md.update(str.getBytes(charset));
}
//得到该摘要
bytes = md.digest();
} catch (NoSuchAlgorithmException e) {
System.out.println("加密算法: "+ algorithm +" 不存在: ");
} catch (UnsupportedEncodingException e) {
System.out.println("数据加密指定的编码格式不支持: " + charset);
}
return null==bytes?null:bytes;
}
/**
* 把字节数组转化成字符串返回
* @param bytes
* @return
*/
public static String BytesConvertToHexString(byte [] bytes) {
StringBuffer sb = new StringBuffer();
for (byte aByte : bytes) {
String s=Integer.toHexString(0xff & aByte);
if(s.length()==1){
sb.append("0"+s);
}else{
sb.append(s);
}
}
return sb.toString();
} //测试上述方法
public static void main(String[] args) {
String test1="test1";
String test2="QWERFVDSCX";
String test3="23423KJHkdfg";
String [] test={test1,test2,test3};
for (String s : test) {
String str=EncryptionStr32(s, MD5, UTF8);
System.out.println("数据:" + s+" 加密之后的结果为:"+str+" 字符串长度为:"+str.length());
str = EncryptionStr16(s, MD5, UTF8);
System.out.println("数据:" + s+" 加密之后的结果为:"+str+" 字符串长度为:"+str.length());
}
}
}

  程序运行结果:

 数据:test1 加密之后的结果为:5a105e8b9d40e1329780d62ea2265d8a 字符串长度为:32
数据:test1 加密之后的结果为:9d40e1329780d62e 字符串长度为:16
数据:QWERFVDSCX 加密之后的结果为:ce5b403e336fb819b48b08dbfd39fbf3 字符串长度为:32
数据:QWERFVDSCX 加密之后的结果为:336fb819b48b08db 字符串长度为:16
数据:23423KJHkdfg 加密之后的结果为:6a91f81e7809f6f79c753a054543d128 字符串长度为:32
数据:23423KJHkdfg 加密之后的结果为:7809f6f79c753a05 字符串长度为:16

2 MD5加密 java实现的更多相关文章

  1. 利用Java自带的MD5加密java.security.MessageDigest;

    MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...

  2. MySql md5加密 sqlserver md5加密 C# md5加密 java md5加密

    便民md5加密: 百度md5加密: MySQL 加密语法: MD5(加密字符串) -- 中文加密 SELECT MD5('你好') -- 中文加密匹配查询 SELECT * FROM 表名 WHERE ...

  3. MD5加密Java工具类

    原文:http://www.open-open.com/code/view/1421764946296 import java.security.MessageDigest; public class ...

  4. MD5加密--Java

    MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.R ...

  5. MD5 加密 java代码实现

    package com.company.fjf; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExc ...

  6. MD5加密Java实现

    package cn.mldn.util; public class MD5Code { /* * 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的, 这里把 ...

  7. MD5加密 Java源代码

    package lwp; /** * * @author 梁WP */ public class MD5_Encoding { // RFC1321中定义的标准4*4矩阵的常量定义. static f ...

  8. MD5加密,java String 转变成MD5 String 详细代码,工具类Android开发必备

    /** * MD5加码.32位 * @param inStr * @return */ public static String MD5(String inStr) { MessageDigest m ...

  9. java中使用MD5加密技术

    在项目中经常会对一些信息进行加密,现在常用的信息加密技术有:MD5.RSA.DES等,今天主要说一下,md5加密,以及如何在java代码根据自己的业务需求使用md5. MD5简介: MD5即Messa ...

随机推荐

  1. LIS n*log(n)的理解

    很多时候lis 用二分的方法比较方便 这里写一下他的原理 这里仅对严格的最长上升子序列做讨论 这里有两个数列  一个数列是 原串的数列 a1-an  另一个数列是最长上升子序列辅助数列 s数列的长度为 ...

  2. django TypeError: 'module' object is not callable

    原因:导入模块时直接把模块当函数使用 from rest_framework import reverse #import reverse module @api_view(("GET&qu ...

  3. 使用HTML5中的Canves标签制作时钟特效

    <!DOCTYPE html > <html> <head> </head> <body> <canvas id="cloc ...

  4. 一个Hadoop难以查找的错误

    This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh Starting namenodes on [Master1 ...

  5. Holes in the text Add problem to Todo list Problem code: HOLES

    import sys def count_holes(letter): hole_2 = ['A', 'D', 'O', 'P', 'Q', 'R'] if letter == 'B': return ...

  6. Codeforces 543D Road Improvement

    http://codeforces.com/contest/543/problem/D 题意: 给定n个点的树 问: 一开始全是黑边,对于以i为根时,把树边白染色,使得任意点走到根的路径上不超过一条黑 ...

  7. Unity3D中的工具类

    1.时间:Unity提供了Time类,这个类主要用来获取当前的系统时间. Time.time:从游戏开始后开始计时,表示截止目前共运行的游戏时间. Time.deltaTime:获取Update()方 ...

  8. SQL判断一个数是整数还是小数

    DECLARE @number1 AS numeric(10,2),@number2 AS numeric(10,2) SELECT @number1=10.00,@number2=10.2 SELE ...

  9. NSIS检测操作系统x64还是x86的问题。

    想共同维护一个NSIS脚本文件的,不想搞两个版本的脚本文件了.开始想到了!if语句,没试过,不知道行不行得通.后来google了一下.可以用两个头文件搞定.参照下面链接 Reference: http ...

  10. translate函数说明

    TRANSLATE(expr, from_string, to_string) from_string 与 to_string 以字符为单位,对应字符一一替换. SQL> SELECT TRAN ...