• JAVA密码技术基础(第二部分)


    确保消息的完整性
    clip_image001 1. 概述
    clip_image001[1] 2. 什么是消息摘要?
    clip_image001[2] 3. 算法、类和方法
    clip_image001[3] 4. 消息摘要代码示例
    clip_image001[4] 5. 消息摘要样本执行的结果
    clip_image001[5] 6. 消息认证码示例
    clip_image001[6] 7. 消息认证样本执行

    概述

     

    我们将在本章中了解消息摘要,它获取消息中的数据并生成一个被设计用来表示该消息“指纹”的位块。我们还将讨论 JDK 1.4 支持的与消息摘要相关的算法、类和方法,并为消息摘要和消息认证特性提供代码示例和样本的执行代码。

    什么是消息摘要?

     

    消息摘要是一种确保消息完整性的功能。消息摘要获取消息作为输入并生成位块(通常是几百位长),该位块表示消息的指纹。消息中很小的更改(比如说,由闯入者和窃听者造成的更改)将引起指纹发生显著更改。

    消息摘要函数是单向函数。从消息生成指纹是很简单的事情,但生成与给定指纹匹配的消息却很难。

    消息摘要可强可弱。校验和(消息的所有字节异或运算的结果)是弱消息摘要函数的一个示例。很容易修改一个字节以生成任何期望的校验和指纹。大多数强函数使用散列法。消息中 1 位更改将引起指纹中巨大的更改(理想的比例是更改指纹中 50% 的位)。

    算法、类和方法

     

    JDK 1.4 支持下列消息摘要算法:

    • MD2MD5,它们都是 128 位算法
    • SHA-1 是 160 位算法
    • SHA-256SHA-383SHA-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") );
    
    }
    
    }

    消息认证样本执行

     

    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>

    注:因为代码用线程行为定时来生成优质的伪随机数,所以密钥生成很费时。一旦生成了第一个数,其它数的生成就快得多了。

    还请注意,与消息摘要不同的是,消息认证码使用密码提供程序。(有关提供程序的更多信息,请参阅第三方库充实了安全性。)

  • 相关阅读:
    小程序开发记录一:开发流程
    js小功能3:一个简单的计算器功能
    js小功能2:切换
    js小功能1:全选全不选
    通过javascript得到当前的日期和计算出该班级的平均分
    CSS 使用calc()获取当前可视屏幕高度
    javaScript基础题
    Python标准库03 路径与文件 (os.path包, glob包)
    Python标准库02 时间与日期 (time, datetime包)
    Python标准库01 正则表达式 (re包)
  • 原文地址:https://www.cnblogs.com/chinareny2k/p/1676669.html
Copyright © 2020-2023  润新知