Java MessageDigest

时间:2020-01-09 10:35:55  来源:igfitidea点击:

Java MessageDigest类表示一种加密哈希函数,可以根据二进制数据计算消息摘要。当我们收到一些加密的数据时,我们将无法从数据本身中看到它是否在运输过程中被修改。消息摘要可以帮助减轻该问题。

为了能够检测到加密数据在传输中是否已被修改,发送者可以从数据中计算出消息摘要,并将其与数据一起发送。收到加密的数据和消息摘要后,我们可以从数据中重新计算消息摘要,并检查计算出的消息摘要是否与随数据接收的消息摘要匹配。如果两个消息摘要匹配,则有可能在传输期间未修改加密数据。

要使消息摘要用作修改检测机制,必须满足几个条件。但是,确切的条件是密码学理论的一部分,因此我们将必须访问该理论以阅读如何正确使用消息摘要。本教程仅说明如何在MessageDigest类中使用消息摘要的Java密码学API表示形式。

创建一个MessageDigest实例

要创建Java MessageDigest实例,请调用MessageDigest类的静态getInstance()方法。这是创建MessageDigest实例的示例:

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

传递给getInstance()方法的text参数是要使用的具体消息摘要算法的名称。

消息摘要算法

Java密码学API支持以下消息摘要算法(尽管具体密码学提供者可能支持更多!):

算法名称
MD2
MD5
SHA-1
SHA-256
SHA-384
SHA-512

并非所有这些消息摘要算法都是同样安全的。在撰写本文时,建议我们使用" SHA-256"或者更高版本,以获取最高的安全性。

计算邮件摘要

一旦创建了JavaMessageDigest实例,我们就可以使用它来计算数据中的消息摘要。如果我们只有一个数据块来计算消息摘要,请使用digest()方法。这是从单个数据块计算消息摘要的样子:

byte[] data1 = "0123456789".getBytes("UTF-8");

MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] digest = messageDigest.digest(data1);

如果我们要在同一消息摘要中包含多个数据块,请调用update()方法并以对digest()的调用结束。这是从多个数据块计算消息摘要的样子:

byte[] data1 = "0123456789".getBytes("UTF-8");
byte[] data2 = "abcdefghijklmnopqrstuvxyz".getBytes("UTF-8");

MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(data1);
messageDigest.update(data2);

byte[] digest = messageDigest.digest();