消息摘要(数字摘要)的理解(消息摘要的作用是什么)

  本篇文章为你整理了消息摘要(数字摘要)的理解(消息摘要的作用是什么)的详细内容,包含有消息摘要是什么 消息摘要的作用是什么 消息摘要算法有哪些 消息摘要是指 消息摘要(数字摘要)的理解,希望能帮助你了解 消息摘要(数字摘要)的理解。

  程序员优雅哥 (youyacoder)

  程序员优雅哥 (公众号同名,第一时间更新)

  十年程序员,呆过央企外企私企,做过前端后端架构。分享vue、Java等前后端技术和架构

  
 

   在开发过程中经常会遇到 MD5、SHA1、SHA256 等词语,这些是加密算法吗?严格意义上讲,这些并不是加密算法,而是消息摘要算法。咱就用人听得懂的话来聊聊“消息摘要”。

  
Java 密码技术 - 02- 消息摘要(数字摘要)

  在开发过程中经常会遇到 MD5、SHA1、SHA256 等词语,这些是加密算法吗?严格意义上讲,这些并不是加密算法,而是消息摘要算法。咱就用人听得懂的话来聊聊“消息摘要”。

  1 消息摘要简介

  在现实生活中,我们每个人都有指纹,指纹在一定意义是警方破案的有力证据之一。每个人的指纹与生俱来,李四无法盗用张三的指纹,张三也没法篡改自己的指纹。

  消息摘要也是如此。消息 —— 无论是任何类型的消息,在计算机中本质上就是数据,一堆二进制 bit 组成的数据,这些数据按照某种规则计算以后的结果是固定的。如果数据发生改变,则计算出来的结果就会变化,这个计算出来的结果就是消息摘要。

  张三给李四发送一条消息,并且携带这条消息的消息摘要。李四收到消息时,按照相同的计算规则计算得到计算结果,将这个计算结果与张三发送消息时携带的消息摘要进行对比。如果在消息传输过程中,消息被劫持者篡改了内容,那么计算结果与携带的消息摘要的值便不相等,从而可以判断出消息被篡改了。

  所以消息摘要,是一种验证数据完整性的算法,是对付信息面临被篡改威胁的策略之一。

  1.1 消息摘要的概念

  消息摘要:Message Digest,又称为数字摘要(Digital Digest),要高大上还可以将其叫为:单向散列函数(one-way hash function)、哈希函数、杂凑函数等。消息摘要是一个唯一对应一个消息的固定长度的值,由一个单向哈希加密函数对消息进行计算而得到。通俗点说,无论是什么消息、无论什么时间、什么地点,只要采用同样的计算规则(算法),得到的结果都是一样的;并且无论消息长还是短,同一个算法计算得到的长度都是固定的。

  1.2 消息摘要的特点

  从上面的描述可以看出消息摘要的特点:

  1)只要消息不同,对其摘要后产生的结果也不同;
 

  2)相同的消息一定会得到相同的结果;
 

  3)无论消息的长短,计算出来的消息摘要长度是固定的;例如:
 

  MD5 摘要后的长度为 128 个bit;
 

  SHA-1 摘要后的长度为 160 个bit;
 

  4)消息摘要算法是单向的,不可逆。

  1.3 常见的消息摘要算法

  常见的消息摘要算法有: MD5、SHA-1、SHA-256、SHA-512,其他还有 MD4、SHA-2、SHA-224、SHA-384 等。

  2 Java 实现

  2.1 MessageDigest 类

  Java 中提供了 java.security.MessageDigest 类来实现数字摘要:

  首先通过 getInstance 获取实例,入参为摘要算法,即 MD5、SHA-1 之类的;

  调用实例的 digest 方法获取摘要(结果为byte[]);

  由于摘要后的结果为 byte[],不方便阅读,可封装一个十六进制的工具类:

  

public class HexUtils {

 

   * 十六进制字符串转 byte[]

   public static byte[] toBytes(String hex) {

   if (hex == null hex.length() 1) {

   return null;

   } else {

   byte[] result = new byte[hex.length() / 2];

   int j = 0;

   for (int i = 0; i hex.length(); i += 2) {

   result[j++] = (byte) Integer.parseInt(hex.substring(i, i + 2), 16);

   return result;

   * byte[] 转十六进制字符串

   public static String toHex(byte[] bytes) {

   StringBuilder stringBuilder = new StringBuilder("");

   if (bytes == null bytes.length = 0) {

   return null;

   for (byte b : bytes) {

   int v = b 0xFF;

   String hv = Integer.toHexString(v);

   if (hv.length() 2) {

   stringBuilder.append(0);

   stringBuilder.append(hv);

   return stringBuilder.toString();

  

 

  十六进制中一个字符对应 4 个bit,故转换后的十六进制字符串长度:

  MD5:128 bit,十六进制为 32 个字符;

  SHA-1:160 bit,十六进制为 40 个字符;

  SHA-256:256 bit,十六进制为 64 个字符;

  SHA-512:512 bit,十六进制为 128个字符;

  2.2 Java Demo

  

package com.yygnb.demo.crypto;

 

  import com.yygnb.demo.utils.HexUtils;

  import org.junit.Test;

  import java.nio.charset.StandardCharsets;

  import java.security.MessageDigest;

  public class MessageDigestTest {

   private String md(String input, String algorithm) throws Exception {

   MessageDigest md = MessageDigest.getInstance(algorithm);

   byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));

   return HexUtils.toHex(digest);

   @Test

   public void testMessageDigest() throws Exception {

   String input = "Hello,张三";

   System.out.println(md(input, "MD5"));

   System.out.println(md(input, "SHA-1"));

   System.out.println(md(input, "SHA-256"));

   System.out.println(md(input, "SHA-512"));

  

 

  执行后的结果如下:

  

5e7a42e5da82f1c0a6557e6c29d651dc

 

  c49a06ded3b4ae492741428779eb1ed04889500d

  a5a9d6d78806e179d917a1c557839fcdb68e11527a619179efd49e53c8acd6fb

  2eb3400b3999bfa6db1310cfafc8cbe3ab6d4e48d1e428c4db2627f5605a71973a546f5bb711b0189583d2fcf6f9d5cef83896657f4651a13975498e591db950

  

 

  大家在自己电脑上运行的结果应该也是一样的。

  3 JS 实现

  JavaScript 有很多开源库支持消息摘要,如 md5.js、sha.js、jsencrypt 等,考虑到后面的文章要写对称加密、非对称加密,这里采用 crypto-js。crypto-js 提供了各种摘要算法、加解密算法的实现。

  3.1 安装依赖

  安装依赖:

  

yarn add crypto-js

 

  

 

  由于我使用的是 TypeScript 语言,所以还需要安装 crypto-js 的 TS 类型:

  

yarn add @types/crypto-js -D

 

  

 

  3.2 引入函数

  从 crypto-js 中引入需要使用到的函数,如 md5、sha1、hex 等,其中 hex 提供了 stringify 方法,将摘要结果转为十六进制字符串。

  

import md5 from crypto-js/md5

 

  import sha1 from crypto-js/sha1

  import sha256 from crypto-js/sha256

  import sha512 from crypto-js/sha512

  import hex from crypto-js/enc-hex

  

 

  3.3 调用函数

  

const input = Hello,张三

 

  const s1 = hex.stringify(md5(input))

  const s2 = hex.stringify(sha1(input))

  const s3 = hex.stringify(sha256(input))

  const s4 = hex.stringify(sha512(input))

  console.log(s1)

  console.log(s2)

  console.log(s3)

  console.log(s4)

  

 

  由于被摘要的消息与上面 Java 的一样,所以这里 JS 摘要后的结果与上面 Java 的结果完全一致:

  感谢你阅读本文,如果本文给了你一点点帮助或者启发,还请三连支持一下,点赞、关注、收藏,作者会持续与大家分享更多干货

  以上就是消息摘要(数字摘要)的理解(消息摘要的作用是什么)的详细内容,想要了解更多 消息摘要(数字摘要)的理解的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: