Java 用公钥计算消息摘要的验证码

概要:

在计算机安全通信过程中,常使用消息摘要和消息验证码来保证传输的数据的安全性,并可以防止第三方的恶意修改。本实例将利用消息摘要和消息验证码(公钥)来验证传输的消息摘要是否正确。

| |目录

技术要点

用公钥计算消息摘要的验证码的技术要点如下:

  • 输入/输出流的使用。

  • 消息摘要串的应用。

  • 消息摘要转换成字符串。

代码实现

package net.xsoftlab.baike;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
//可利用共同的密钥来计算消息摘要的验证码 MyMessage.java
public class MyMessage {
	public static void main(String[] args) throws Exception {
		message_1();
		message_2();
		message_3();
	}
	public static void message_1() throws Exception {
		String str = "Beautiful my home in China";// 定义一个消息摘要串
		// 共同的密钥编码,这个可以通过其它算法计算出来
		byte[] kb = { 11, 105, -119, 50, 4, -105, 16, 38, -14, -111, 21, -95,
				70, -15, 76, -74, 67, -88, 59, -71, 55, -125, 104, 42 };
		SecretKeySpec k = new SecretKeySpec(kb, "HMACSHA1");// 获取共同的密钥
		Mac m = Mac.getInstance("HmacMD5");// 获取Mac对象
		m.init(k);// 用给定的密钥初始化此 Mac 对象
		m.update(str.getBytes("UTF-8"));
		byte[] by = m.doFinal();// 生成消息码
		// 下面把消息码转换为字符串
		String result = "";
		for (int i = 0; i < by.length; i++) {
			result += Integer.toHexString((0x000000ff & by[i]) | 0xffffff00)
					.substring(6);
		}
		System.out.println("用共同的密钥来计算消息摘要的验证码:" + result);
	}
	// 计算一段字符串的消息摘要
	public static void message_2() throws Exception {
		String str = "Nice to meet you,Tom";
		MessageDigest md = MessageDigest.getInstance("MD5");
		// 常用的有MD5,SHA算法等
		md.update(str.getBytes("UTF-8"));// 传入原始字串
		byte[] by = md.digest();// 计算消息摘要放入byte数组中
		// 下面把消息摘要转换为字符串
		String result = "";
		for (int i = 0; i < by.length; i++) {
			result += Integer.toHexString((0x000000ff & by[i]) | 0xffffff00)
					.substring(6);
		}
		System.out.println("一段字符串的消息摘要为:" + result);
	}
	// 计算从输入(出)流中计算消息摘要。
	public static void message_3() throws Exception {
		String fileName = "test.txt";
		MessageDigest md = MessageDigest.getInstance("MD5");
		FileInputStream fin = new FileInputStream(fileName);
		DigestInputStream din = new DigestInputStream(fin, md);// 构造输入流
		int length;
		while ((length = din.read()) != -1) {
			// 做一些对文件的处理
			if (length == '$')
				din.on(true); // 当遇到文件中的符号$时才开始计算
		}
		byte[] by = md.digest();// 获得消息摘要
		// 下面把消息摘要转换为字符串
		String result = "";
		for (int i = 0; i < by.length; i++) {
			result += Integer.toHexString((0x000000ff & by[i]) | 0xffffff00)
					.substring(6);
		}
		System.out.println("从文本中计算消息摘要为:" + result);
	}
}

程序解读

  1. 消息摘要主要是检测原始数据是否被修改过。消息摘要与加密不同,加密是从原始数据中获得一部分信息,因此,消息摘要可以被认做是原始数据的指纹。

  2. 消息验证码在现实中的应用。例如,当X和Y通信时,X将数据传给Y,同时也将数据的消息摘要传给Y,Y收到后可以用该消息摘要验证X传来的消息是否正确。消息验证码可以解决这一问题。使用消息验证码的前提是X和Y双方有一个共同的密钥,这样X可以将数据计算出来的消息摘要加密后发给Y,以防消息摘要被改。由于使用了共同的密钥,所以称为“验证码”。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消