JAVA密码技术基础(第二部分)
2010-03-02 17:17
483 查看
确保消息的完整性
1. 概述
2. 什么是消息摘要?
3. 算法、类和方法
4. 消息摘要代码示例
5. 消息摘要样本执行的结果
6. 消息认证码示例
7. 消息认证样本执行
我们将在本章中了解消息摘要,它获取消息中的数据并生成一个被设计用来表示该消息“指纹”的位块。我们还将讨论 JDK 1.4 支持的与消息摘要相关的算法、类和方法,并为消息摘要和消息认证特性提供代码示例和样本的执行代码。
消息摘要是一种确保消息完整性的功能。消息摘要获取消息作为输入并生成位块(通常是几百位长),该位块表示消息的指纹。消息中很小的更改(比如说,由闯入者和窃听者造成的更改)将引起指纹发生显著更改。
消息摘要函数是单向函数。从消息生成指纹是很简单的事情,但生成与给定指纹匹配的消息却很难。
消息摘要可强可弱。校验和(消息的所有字节异或运算的结果)是弱消息摘要函数的一个示例。很容易修改一个字节以生成任何期望的校验和指纹。大多数强函数使用散列法。消息中 1 位更改将引起指纹中巨大的更改(理想的比例是更改指纹中 50% 的位)。
JDK 1.4 支持下列消息摘要算法:
MD2 和 MD5,它们都是 128 位算法
SHA-1 是 160 位算法
SHA-256、SHA-383 和 SHA-512 提供更长的指纹,大小分别是 256 位、383 位和 512 位
MD5 和 SHA-1 是最常用的算法。
MessageDigest 类操作消息摘要。消息摘要代码示例中使用下列方法:
MessageDigest.getInstance("MD5"):创建消息摘要。
.update(plaintext):用明文字符串计算消息摘要。
.digest():读取消息摘要。
如果密钥被用作消息摘要生成过程的一部分,则将该算法称为消息认证码。JDK 1.4 支持 HMAC/SHA-1 和 HMAC/MD5 消息认证码算法。
Mac 类使用由 KeyGenerator 类产生的密钥操作消息认证码。消息认证码示例中使用了下列方法:
KeyGenerator.getInstance("HmacMD5") 和 .generateKey():生成密钥。
Mac.getInstance("HmacMD5"):创建 MAC 对象。
.init(MD5key):初始化 MAC 对象。
.update(plaintext) 和 .doFinal():用明文字符串计算 MAC 对象。
D:\IBM>java MessageAuthenticationCodeExample "This is a test!"
Start generating key
Finish generating key
SunJCE Provider (implements DES, Triple DES, Blowfish, PBE, Diffie-Hellman,
HMAC-MD5, HMAC-SHA1)
MAC:
Dkdj47x4#.@kd#n8a-x>
注:因为代码用线程行为定时来生成优质的伪随机数,所以密钥生成很费时。一旦生成了第一个数,其它数的生成就快得多了。
还请注意,与消息摘要不同的是,消息认证码使用密码提供程序。(有关提供程序的更多信息,请参阅第三方库充实了安全性。)
1. 概述
2. 什么是消息摘要?
3. 算法、类和方法
4. 消息摘要代码示例
5. 消息摘要样本执行的结果
6. 消息认证码示例
7. 消息认证样本执行
概述 |
什么是消息摘要? |
消息摘要函数是单向函数。从消息生成指纹是很简单的事情,但生成与给定指纹匹配的消息却很难。
消息摘要可强可弱。校验和(消息的所有字节异或运算的结果)是弱消息摘要函数的一个示例。很容易修改一个字节以生成任何期望的校验和指纹。大多数强函数使用散列法。消息中 1 位更改将引起指纹中巨大的更改(理想的比例是更改指纹中 50% 的位)。
算法、类和方法 |
MD2 和 MD5,它们都是 128 位算法
SHA-1 是 160 位算法
SHA-256、SHA-383 和 SHA-512 提供更长的指纹,大小分别是 256 位、383 位和 512 位
MD5 和 SHA-1 是最常用的算法。
MessageDigest 类操作消息摘要。消息摘要代码示例中使用下列方法:
MessageDigest.getInstance("MD5"):创建消息摘要。
.update(plaintext):用明文字符串计算消息摘要。
.digest():读取消息摘要。
如果密钥被用作消息摘要生成过程的一部分,则将该算法称为消息认证码。JDK 1.4 支持 HMAC/SHA-1 和 HMAC/MD5 消息认证码算法。
Mac 类使用由 KeyGenerator 类产生的密钥操作消息认证码。消息认证码示例中使用了下列方法:
KeyGenerator.getInstance("HmacMD5") 和 .generateKey():生成密钥。
Mac.getInstance("HmacMD5"):创建 MAC 对象。
.init(MD5key):初始化 MAC 对象。
.update(plaintext) 和 .doFinal():用明文字符串计算 MAC 对象。
消息摘要代码示例 |
import java.security.*; import javax.crypto.*; // // Generate a Message Digest public class MessageDigestExample { public static void main (String[] args) throws Exception { // // check args and get plaintext if (args.length !=1) { System.err.println("Usage: java MessageDigestExample text"); System.exit(1); } byte[] plainText = args[0].getBytes("UTF8"); // // get a message digest object using the MD5 algorithm MessageDigest messageDigest = MessageDigest.getInstance("MD5"); // // print out the provider used System.out.println( "\n" + messageDigest.getProvider().getInfo() ); // // calculate the digest and print it out messageDigest.update( plainText); System.out.println( "\nDigest: " ); System.out.println( new String( messageDigest.digest(), "UTF8") ); } }消息摘要样本执行的结果 D:\IBM>java MessageDigestExample "This is a test!" SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests ; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator ; PKIX CertPathBuilder; LDAP, Collection CertStores) Digest: D93,.x2%$kd8xdp3di5*
消息认证码示例
import java.security.*; import javax.crypto.*; // // Generate a Message Authentication Code public class MessageAuthenticationCodeExample { public static void main (String[] args) throws Exception { // // check args and get plaintext if (args.length !=1) { System.err.println ("Usage: java MessageAuthenticationCodeExample text"); System.exit(1); } byte[] plainText = args[0].getBytes("UTF8"); // // get a key for the HmacMD5 algorithm System.out.println( "\nStart generating key" ); KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5"); SecretKey MD5key = keyGen.generateKey(); System.out.println( "Finish generating key" ); // // get a MAC object and update it with the plaintext Mac mac = Mac.getInstance("HmacMD5"); mac.init(MD5key); mac.update(plainText); // // print out the provider used and the MAC System.out.println( "\n" + mac.getProvider().getInfo() ); System.out.println( "\nMAC: " ); System.out.println( new String( mac.doFinal(), "UTF8") ); } }
消息认证样本执行 |
Start generating key
Finish generating key
SunJCE Provider (implements DES, Triple DES, Blowfish, PBE, Diffie-Hellman,
HMAC-MD5, HMAC-SHA1)
MAC:
Dkdj47x4#.@kd#n8a-x>
注:因为代码用线程行为定时来生成优质的伪随机数,所以密钥生成很费时。一旦生成了第一个数,其它数的生成就快得多了。
还请注意,与消息摘要不同的是,消息认证码使用密码提供程序。(有关提供程序的更多信息,请参阅第三方库充实了安全性。)
相关文章推荐
- JAVA密码技术基础(第二部分)
- java基础部分-《第二部分》-异常机…
- JavaSE基础第二部分:Java基础语法之关键字
- JavaSE基础第二部分:Java基础语法之常量与变量
- 密码和Java中的加解密之基础部分
- 黑马程序员--java技术--基础部分
- android面试题目大全<第二部分>,java基础部分
- 二刷java核心技术_重温基础部分的练习代码保存
- Java语言基础特性——第二部分
- Java WEB开发实战 之 第二部分:Web应用基础知识【私塾在线原创】
- java基础部分总结第二部分
- Java基础学习笔记 第二部分 part 3
- JavaSE基础第二部分:Java基础语法之类型
- JavaSE基础第二部分:Java基础语法之流程控制语句
- JavaSE基础第二部分:Java基础语法之操作符
- Java动画编程基础第二部分
- java基础问题(第二部分)
- Java泛型基础知识第二部分整理
- 某个知名技术论坛用户名和密码泄露(第二部分)
- JAVA 密码技术基础(第一部分)