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();