消息摘要(數字摘要)的理解 - 查看很多資料後的感悟

来源:https://www.cnblogs.com/youyacoder/archive/2022/08/26/16627962.html
-Advertisement-
Play Games

在開發過程中經常會遇到 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 類來實現數字摘要:

  1. 首先通過 getInstance 獲取實例,入參為摘要演算法,即 MD5、SHA-1 之類的;
  2. 調用實例的 digest 方法獲取摘要(結果為byte[]);
  3. 由於摘要後的結果為 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 的結果完全一致:

image-20220825013559038

感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關註、收藏,作者會持續與大家分享更多乾貨


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是標簽調用?標簽調用是根據調用條件(condition)從數據表(table)讀取調用數量(pagesize)條數據,並按排序方式(order)排序,最終通過標簽模板的佈局輸出數據。可以看出,標簽的工作分兩個部分,一是讀取數據,二是顯示數據。標簽函數原型標簽函數保存於 include/tag.f ...
  • 本文講解了什麼是SpringMVC,詳解第一個MVC程式,restFul和控制器講解,數據處理及跳轉,JSON交互處理,SSM框架的整合,Ajax詳解以及攔截器的講解都在此文章里 ...
  • Java集合10 21.集合家庭作業 21.1Homework01 按要求實現: 封裝一個新聞類,包括標題和內容屬性,提供get、set方法,重寫toString方法,列印對象時只列印標題; 只提供一個帶參數的構造器,實例化對象時,只初始化標題;並實例化兩個對象: 新聞一:新冠確診病例超千萬,數百萬 ...
  • 很多小伙伴總是問我,數據來源怎麼找啊,怎麼抓包,其實很簡單,多操作幾遍就記住了。 今天咱們通過三個案例來展示一下 某牙直播抓包 首先咱們進入目標網頁,隨便找一個視頻,通過開發者工具抓包分析。 首先按F12或者點擊右鍵選擇檢查,打開開發者工具,依次選擇 network(網路面板) → AII (全部) ...
  • 前言 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 又到了學Python時刻~激不激動,開不開森 ! web版的微信有專門的實時收發消息api,可以用Python直接調用,但是現在基本上登錄不了web版微信,所以就用不了了。 但這不是還有windows版的微信嗎,於是在基於前輩寫好的第三方庫,今天我們來實 ...
  • 有一個線性表,採用帶頭結點的單鏈表L來存儲,設計一個演算法將其逆置,且不能建立新節點,只能通過表中已有的節點的重新組合來完成。 ##分析:線性表中關於逆序的問題,就是用建立鏈表的頭插法.而本題要求不能建立新結點,也就不能把元素重新弄到一個表中.可以將L中的元素作為逆轉後的L的元素來源,將L->next ...
  • 1.元組的定義 元組,其實就是一個不可變的‘列表’ 用小括弧()定義,括弧內用逗號分隔開任意類型的數據,當只有一個數據時也需要加逗號 元組中的數據是不可改變指的是:數據的記憶體地址不可改變,如果元組裡是列表(可變類型),可以通過方法往列表裡增刪值!!! 2.元組的作用 按照索引/位置存放多個數據,這些 ...
  • SQL與Pandas都可以完成大部分數據分析需求。本文用SQL與Pands逐一實現10類核心數據分析需求,輕鬆進行對比學習:數據選擇、限制、統計計數、排序、新欄位生成、數據選擇、數據分組、統計均值、方差、極差/範圍。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...