`
阿尔萨斯
  • 浏览: 4247656 次
社区版块
存档分类
最新评论

Java数字摘要 MD5

 
阅读更多
package com.stone.security;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.DigestInputStream;
import java.security.DigestOutputStream;
import java.security.MessageDigest;
import java.util.Arrays;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

/**
 * 消息摘要是一种算法:无论原始数据多长,消息摘要的结果都是固定长度的;是一种不可逆的算法
 * 原始数据任意bit位的变化,都会导致消息摘要的结果有很大的不同,且根据结果推算出原始数据的概率极低。
 * 消息摘要可以看作原始数据的指纹,指纹不同则原始数据不同。
 * @author stone
 * @date 2014-03-11 15:55:48
 */
public class MD5 {
	
	
	public static void main(String[] args) throws Exception {
		encodeByMAC("中国oP……&*()…&802134…");
		
		encodeByMd5("中国oP……&*()…&802134…");
		
		md5File();
	}
	
	/**
	 * 使用MAC 算法的 消息摘要
	 * @param data
	 * @throws Exception
	 */
	public static void encodeByMAC(String data) throws Exception{
//		KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
//		SecretKey key = keyGen.generateKey(); //这个每次生成的key不一样, 此处不能使用
		
		PBEKeySpec keySpec = new PBEKeySpec("randomkey^(^&*^%$".toCharArray());
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
		SecretKey key = keyFactory.generateSecret(keySpec);
		
		/*
		 *  此类提供“消息验证码”(Message Authentication Code,MAC)算法的功能。
		 *	MAC 基于秘密密钥提供一种方式来检查在不可靠介质上进行传输或存储的信息的完整性。
		 *	通常,消息验证码在共享秘密密钥的两个参与者之间使用,以验证这两者之间传输的信息。
		 *	基于加密哈希函数的 MAC 机制也叫作 HMAC。结合秘密共享密钥,
		 *	HMAC 可以用于任何加密哈希函数(如 MD5 或 SHA-1)
		 */
		Mac mac = Mac.getInstance("HmacMD5");
		mac.init(key);
		byte[] dest = mac.doFinal(data.getBytes());
		System.out.println(dest.length);
		System.out.println("MAC摘要:" + Arrays.toString(dest));
	}
	
	/**
	 * md5加密  使用消息摘要MessageDigest 处理
	 * @throws Exception 
	 */
	public static String encodeByMd5(String str) throws Exception{
		MessageDigest md5;
		md5 = MessageDigest.getInstance("MD5");
		
		md5.update(str.getBytes()); //先更新摘要
		byte[] digest = md5.digest(); //再通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
		
		/*
		 * 使用指定的 byte 数组对摘要进行最后更新,然后完成摘要计算。
		 * 也就是说,此方法首先调用 update(input),
		 * 向 update 方法传递 input 数组,然后调用 digest()。
		 */
//		byte[] digest = md5.digest(str.getBytes());
		
		String hex = toHex(digest);
		System.out.println("MD5摘要:" + hex);
		return hex;
	}
	
	/**
	 * 文件数据摘要
	 * @throws Exception
	 */
	public static void md5File() throws Exception {
		MessageDigest messageDigest = MessageDigest.getInstance("MD5");
		DigestOutputStream dos = new DigestOutputStream(new FileOutputStream(new File("abc.txt")), messageDigest);
		dos.write("中华人民……&())f*(214)admin*".getBytes());
		dos.close();
		byte[] digest = messageDigest.digest();
		System.out.println("使用流写文件,该文件的摘要为:" + toHex(digest));
		
		
		DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("abc.txt")), messageDigest);
		byte[] buf = new byte[100];
		int len;
		while ((len = dis.read(buf)) != -1) {
			System.out.println("读取到的数据为:" + new String(buf, 0, len));
		}
		dis.close();
		byte[] digest2 = messageDigest.digest();
		//当流读取完毕,即将文件读完了, 这时的摘要 才与 写入时的 一样
		System.out.println("使用流读文件,该文件的摘要为:" + toHex(digest2));
	}
	
	/**
	 * md5 摘要转16进制
	 * @param digest
	 * @return
	 */
	private static String toHex(byte[] digest) {
		StringBuilder sb = new StringBuilder();
		int len = digest.length;
		
		String out = null;
		for (int i = 0; i < len; i++) {
//			out = Integer.toHexString(0xFF & digest[i] + 0xABCDEF); //加任意 salt
			out = Integer.toHexString(0xFF & digest[i]);//原始方法
			if (out.length() == 1) {
				sb.append("0");//如果为1位 前面补个0
			}
			sb.append(out);
		}
		return sb.toString();
	}

}

分享到:
评论

相关推荐

    传智博客Java安全技术 加密、MD5数字摘要

    张孝祥传智博客Java安全技术(加密、MD5数字摘要。。。)

    MD5 信息摘要算法 java版

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

    java版的 MD5

    MD5的全称是Message-digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc,的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量...

    信息-摘要算法5(MD5)Java实现

    MD5主要是通过特定的hash散列方法将文本信息转换成简短的信息摘要,用以验证信息的完整性。一般用于数字签名。 用Java实现的一个例子。

    用MD5消息摘要再用RSA进行签名

    用MD5消息摘要再用RSA进行签名~用MD5消息摘要再用RSA进行签名~用MD5消息摘要再用RSA进行签名~

    数字签名验证(MD5工具)

    MD5是message-digest algorithm 5(信息-摘要算法)的缩写,被广泛用于加密和解密技术上,它可以说是文件的“数字指纹”。任何一个文件,无论是可执行程序、图像文件、临时文件或者其他任何类型的文件,也不管它体积...

    java封装好的md5

    Java中的MD5是一种加密算法,它可以将任意长度的消息压缩到128位的消息摘要中。MD5已被广泛应用于计算机领域,包括密码学、数字签名等。当您需要对敏感数据进行安全传输时,MD5是一种常用的加密方式。在Java中,MD5...

    java通信安全 加密 数字签名 消息摘要

    java通信安全主要包括:md5 密码加密与验证 对称加密与解密 非对称加密以解密 基于MD5信息摘要算法实现密码加密与验证 凯撒加密算法 数字签名与验证 消息验证码 消息摘要 所有程序都经过了测试

    java_DigitalSign.rar_ sign md5_hash md5 in java_公钥数字签名_加密_数字签名 j

    (1)发送方使用MD5算法对原始信息进行计算,获得一个固定长度的信息摘要 (2)发送方用自己的私钥加密生成的信息生成发送方的数字签名,发送方把这个数字签名作为发送信息的附件和明文信息,一同用接收方的公钥进行...

    信息摘要,数字签名的java实现

    (1)发送方使用MD5算法对原始信息进行计算,获得一个固定长度的信息摘要 (2)发送方用自己的私钥加密生成的信息生成发送方的数字签名,发送方把这个数字签名作为发送信息的附件和明文信息,一同用接收方的公钥进行...

    MD5加密java技術

    不管是MD2、MD4还是MD5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全不同,那是因为MD2是为8位机器做过设计优化的,而MD4和MD5却...

    用Java实现MD4算法--密码学.docx

    用Java实现MD4算法--密码学 MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。...其摘要长度为128位,一般128位长的MD4散列被表示为32位的十六...这个算法影响了后来的算法如MD5、SHA 家族和RIPEMD等。

    java 加解密算法,摘要算法和数字签名算法

    包含Base64 ...包含摘要算法:MD2,MD4,MD5,SHA1,SHA2(SHA-224,SHA-256,SHA-384,SHA-512) 数字签名算法:RSA,DSA,ECDSA 详情请查看:http://blog.csdn.net/baidu_34012226/article/details/53331147

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) ...1.MD5 2.SHA 3.MAC 四。数字签名:JDK实现 1.RSA 2.DSA 3.ECDSA 五。对称加密算法: 1.3DES 2.AES 3.PBE

    DSS数字签名标准Java实现

    所谓数字签名,是一种用数字通信形式达到签名的功能,目的是证明通信双方的身份、达到确保通信的安全,是一套密码系统。 这里用RSA加密,用MD5形成摘要,验证信息完整性。

    java 加解密算法(包含摘要算法和数字签名)

    包含java加解密算法(base64,des,3des,aes,pbe,dh,rsa,ElGamal) 包含java摘要算法(md2,md4,md5,sha1,sha2((SHA-224,SHA-256, SHA-384,SHA-512)),mac) 包含签名算法(rsa,dsa,ecdsa)

    Java加密和数字签名编程快速入门

    主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1,jdk1.5对上面都提供了支持,在java中进行消息摘要很简单, java.security....

    JAVA上百实例源码以及开源项目

    摘要:JAVA源码,系统相关,数字签名,数字证书  Java 数字签名、数字证书的相关实例。  关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名...

    Java案例开发锦集

    案例1 用户登录验证的完整程序 案例2 MD5的Javabean实现 案例3 用公钥计算消息摘要的验证码 案例4-1 Java中的数字证书的生成及维护方法 案例4-2 数字证书的签发(签名) 案例4-3 利用数字证书给...

    JAVA上百实例源码以及开源项目源代码

    摘要:JAVA源码,系统相关,数字签名,数字证书  Java 数字签名、数字证书的相关实例。  关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名...

Global site tag (gtag.js) - Google Analytics