2 MD5加密 java实现
百度百科对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实现的更多相关文章
- 利用Java自带的MD5加密java.security.MessageDigest;
MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...
- MySql md5加密 sqlserver md5加密 C# md5加密 java md5加密
便民md5加密: 百度md5加密: MySQL 加密语法: MD5(加密字符串) -- 中文加密 SELECT MD5('你好') -- 中文加密匹配查询 SELECT * FROM 表名 WHERE ...
- MD5加密Java工具类
原文:http://www.open-open.com/code/view/1421764946296 import java.security.MessageDigest; public class ...
- MD5加密--Java
MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.R ...
- MD5 加密 java代码实现
package com.company.fjf; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExc ...
- MD5加密Java实现
package cn.mldn.util; public class MD5Code { /* * 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的, 这里把 ...
- MD5加密 Java源代码
package lwp; /** * * @author 梁WP */ public class MD5_Encoding { // RFC1321中定义的标准4*4矩阵的常量定义. static f ...
- MD5加密,java String 转变成MD5 String 详细代码,工具类Android开发必备
/** * MD5加码.32位 * @param inStr * @return */ public static String MD5(String inStr) { MessageDigest m ...
- java中使用MD5加密技术
在项目中经常会对一些信息进行加密,现在常用的信息加密技术有:MD5.RSA.DES等,今天主要说一下,md5加密,以及如何在java代码根据自己的业务需求使用md5. MD5简介: MD5即Messa ...
随机推荐
- Slony-I双机备份
测试环境:postgresql 9.3.5,slony-I2.2.3(application stack builder提供)以下参考网上教程亲自测试总结 ---------------------- ...
- AVL树相关操作
#include <iostream> using namespace std; //AVL树的节点 template<typename T> class TreeNode { ...
- [Mugeda HTML5技术教程之7]添加动画
前一节我们讲述了怎么在新建的作品中添加元素,元素加好以后我们还想让他们动起来,来实现比较炫的效果.这节我们将要讲述怎么给元素添加动画.Mugeda动画是通过时间轴和帧来实现的.通过在时间轴上创建图层和 ...
- Python学习笔记总结(四)异常处理
1.基础 try/except/else:[else是可选的]捕捉由代码中的异常并恢复,匹配except里面的错误,并执行except中定义的代码,后继续执行程序(发生异常后,由except捕捉到异常 ...
- Spring MVC URL传参
Spring MVC 学习 之 - URL参数传递 在学习 Spring Mvc 过程中,有必要来先了解几个关键参数: @Controller: 在类上注解,则此类将编程一个控制器,在项目启 ...
- 吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
有空就要慢慢练起~~~~脑袋动起来是很快乐的事儿....:) <易学PYTHON>演练一遍. from random import choice cave_numbers = range( ...
- logstash 发送zabbix告警
<pre name="code" class="html">[elk@dr-mysql01 test]$ cat t1.conf input { s ...
- 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释
特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...
- 自定义xcode文件模板
下面两个路径都可以用于放模板文件 1. /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Template ...
- virsh -c exs://ip/?no_verify=1 --readonly nodeinfo