Java Cryptography 简明教程

Java Cryptography - Message Digest

哈希函数非常有用,并且出现在几乎所有信息安全应用程序中。

哈希函数是一种数学函数,它将数字输入值转换成另一个压缩数字值。哈希函数的输入长度是任意的,但输出总是固定长度。

哈希函数返回的值称为 message digest 或简单称为 hash values 。下图为哈希函数的插图。

message digest

Java 提供了一个名为 MessageDigest 的类,它属于 java.security 包。此类支持算法,例如 SHA-1、SHA 256、MD5 算法,以将任意长度的消息转换为消息摘要。

要将给定的消息转换为消息摘要,请按照以下步骤操作 −

Step 1: Create a MessageDigest object

MessageDigest 类提供名为 getInstance() 的方法。此方法接受一个 String 变量,指定要使用的算法名称,并返回实现指定算法的 MessageDigest 对象。

如下所示,使用 getInstance() 方法创建 MessageDigest 对象。

MessageDigest md = MessageDigest.getInstance("SHA-256");

Step 2: Pass data to the created MessageDigest object

在创建消息摘要对象之后,你需要将消息/数据传递给它。你可以使用 MessageDigest 类的 update() 方法来做到这一点,此方法接受表示消息的字节数组,并将其添加到/传递到上面创建的 MessageDigest 对象中。

md.update(msg.getBytes());

Step 3: Generate the message digest

你可以使用 digest() 方法生成消息摘要。MessageDigest 类的方法会在当前对象上计算哈希函数,并以字节数组的形式返回消息摘要。

使用 digest 方法生成消息摘要。

byte[] digest = md.digest();

Example

以下是一个示例,它从文件中读取数据并生成消息摘要并将其打印出来。

import java.security.MessageDigest;
import java.util.Scanner;

public class MessageDigestExample {
   public static void main(String args[]) throws Exception{
      //Reading data from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter the message");
      String message = sc.nextLine();

      //Creating the MessageDigest object
      MessageDigest md = MessageDigest.getInstance("SHA-256");

      //Passing data to the created MessageDigest Object
      md.update(message.getBytes());

      //Compute the message digest
      byte[] digest = md.digest();
      System.out.println(digest);

      //Converting the byte array in to HexString format
      StringBuffer hexString = new StringBuffer();

      for (int i = 0;i<digest.length;i++) {
         hexString.append(Integer.toHexString(0xFF & digest[i]));
      }
      System.out.println("Hex format : " + hexString.toString());
   }
}

Output

上述程序生成以下输出 −

Enter the message
Hello how are you
[B@55f96302
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3