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 ...
随机推荐
- 自定义函数标签(JSTL)
创建自定义函数标签步骤: 1.创建类,并且方法只能是静态 public static void operation(calculator cal) 2.书写tld <taglib xmlns=& ...
- 编写自己的javascript功能库之Ajax(仿jquery方式)
本人学习的是php,所以就用php跟js来演示代码了,主要是锻炼自己写js的能力,练练手而已. 下面这是我编写的操作ajax的代码功能,勉强让我称之为库吧.. js代码实例(tool.ajax.js) ...
- Nginx的安装及反向代理设置
因为项目的缘故,接触到了Nginx的安装和反向代理设置,和大家分享下. 一.Nginx的下载.安装cd /homewget http://nginx.org/download/nginx-1.0.5. ...
- memcached学习笔记——连接模型
文章链接:http://www.hcoding.com/?p=121 个人站点:JC&hcoding.com memcached是什么呢?memcached是一个优秀的.高性能的内存缓存工具. ...
- Python 番外 消息队列设计精要
消息队列已经逐渐成为企业IT系统内部通信的核心手段.它具有低耦合.可靠投递.广播.流量控制.最终一致性等一系列功能,成为异步RPC的主要手段之一.当今市面上有很多主流的消息中间件,如老牌的Active ...
- Membership修改密码
MembershipUser mu = Membership.GetUser(labelUserName.Text.Trim());//获取资格用户 try { bool flat = mu.Chan ...
- C语言初学 俩数相除问题
#include<stdio.h> #include<stdlib.h> main() { double a,b; scanf(&q ...
- 【转】android 开发 命名规范
原文网址:http://www.cnblogs.com/ycxyyzw/p/4103284.html 标识符命名法标识符命名法最要有四种: 1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外, ...
- MVC4.0 上传Excel并存入数据库
这里的这个功能实现在WebForm很好实现,上传阶段简单的一个FileUoLoad控件就搞定了,什么取值,什么上传都是浮云,微软都帮我们封装好了,我们只需要一拖一拽就OK了,但这些在MVC中是不行的! ...
- MySQL查询当前数据上一条和下一条的记录
如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): ) [and other_cond ...