1. 程式人生 > >HMAC與數字簽名學習記錄

HMAC與數字簽名學習記錄

密碼學與安全技術

數字簽名

數字簽名用於證實某數字內容的完整性integrity和來源(或不可抵賴性non-repudiation)

典型場景:A需要給B一份資料,但B如何確認這份資料是來自於A且沒有被篡改過呢?
方法:
1. A將資料通過摘要演算法進行計算生成摘要資訊。
2. A將摘要資訊通過自己的私鑰進行加密生成加密串。
3. A將資料和加密串一起傳送給B。
4. B收到A的資料和加密串之後,通過A的公鑰進行解密得到A資料的摘要資訊。
5. B再將A傳送資料部分進行進行摘要計算,如果生成的摘要與傳遞的摘要相同則認為資料沒有被篡改。

問題思考:
1. 摘要演算法是否兩邊統一:(廢話,不解釋大家也都知道摘要演算法不一樣生成的摘要值咋可能一樣呢)
2. 私鑰和公鑰的持有方能否對調:不能,因為為了驗證A是A,必須是用A私鑰進行加密,公鑰進行解密。如果反過來,公鑰加密則不能做到驗證身份的功能,因為公鑰所有人都持有。
3. 公鑰能夠在網路中傳輸,而私鑰不能再網路中傳輸,防止被竊取。
4. B通過比較摘要保證內容不被篡改即保證了資料在傳輸過程中的完整性。
5. B通過持有A的公鑰,保證此資料來自於A而不是其他人(前提私鑰只有A知道,其他人不知道A的私鑰)

HMAC

全稱(Hash-based Message Authentication Code,即基於Hash的訊息的認證碼)。
- 基本過程為對某個訊息,利用提前共享的對稱金鑰和Hash演算法進行加密處理,得到HMAC值。
- 該HMAC值提供方可以證明自己擁有共享金鑰的對稱金鑰,並且訊息自身可以利用HMAC確保未經篡改。

定義HMAC需要一個加密用雜湊函式(表示為H,可以是MD5或者SHA-1)和一個金鑰K。我們用B來表示資料塊的位元組數。(以上所提到的雜湊函式的分割資料塊字長B=64),用L來表示雜湊函式的輸出資料位元組數(MD5中L=16,SHA-1中L=20)。鑑別金鑰的長度可以是小於等於資料塊字長的任何正整數值。應用程式中使用的金鑰長度若是比B大,則首先用使用雜湊函式H作用於它,然後用H輸出的L長度字串作為在HMAC中實際使用的金鑰。一般情況下,推薦的最小金鑰K長度是L個位元組。(來自百度百科)

使用HMAC的客戶端認證流程:
1. 客戶端向伺服器發起連線。
2. 伺服器傳送一個隨機數訊息,保留在session中。
3. 客戶端得到隨機數,通過將隨機數(B) + 認證資訊(K) 通過HASH演算法計算出摘要資訊,並通過對稱加密演算法進行加密。
4. 客戶端將密文資料傳遞給伺服器。
5. 伺服器通過對稱加密解密。
6. 伺服器通過自己儲存的認證資訊+session中的隨機數,以及相同的HASH演算法重新計算摘要值,如果相同則認為客戶端身份合法。

  • 問題思考:
  • HMAC 的作用,能夠保證如下幾件事情
    1. 能夠保證通訊雙方持有的共享金鑰一致,或者說認證資訊一致,再應用到例項中就是使用者登入的密碼與伺服器儲存的一致。
    2. 能夠保證共享金鑰不會再認證過程中被竊取,已經做過為摘要生成的金鑰引數使用。
    3. 能夠保證報文在傳輸過程中沒有被篡改,傳輸資料正確。

說白了HMAC的應用場景就是,我持有你的認證資訊,你來向我發起登入,我要識別出是你,但又要保證你的認證資訊不能被別人輕易獲取,還要保證傳遞過程中報文的正確性。(自己瞎逼逼,如果有錯誤的地方還請大神們指點!)

相關推薦

HMAC數字簽名學習記錄

密碼學與安全技術 數字簽名 數字簽名用於證實某數字內容的完整性integrity和來源(或不可抵賴性non-repudiation) 典型場景:A需要給B一份資料,但B如何確認這份資料是來自於A且沒有被篡改過呢? 方法: 1. A將資料通過摘要演算

Java加解密數字簽名

對稱 數組 aes 生成密鑰 分解 encode rup 特性 ntc Java加解密與數字簽名 2016-08-30 蕊蕊 java編程 ** Java加解密 ** 實現方式:JDK實現,CC,B

java中的常量變量學習記錄

進行 變量類型 過程 java OS 變化 邏輯 存儲 nal 常量的定義:程序運行過程中,其值不會發生變化(更準確的說是不可以發生變化)的量叫做常量。 常量的作用:簡單、直觀的描述一個東西,是變量的基礎,是程序運行的基礎。 常量分為兩大類:一類:原始值(不需要定義即可使用

用go編寫區塊鏈系列之5--地址數字簽名

0 介紹 在上一篇文章我們實現了交易。你被灌輸了這樣一種觀念:在比特幣中沒有賬戶,個人資訊資料不需要也不會被儲存。但是仍然需要一些東西去證明你是一筆交易的輸出的所有者。這是比特幣需要地址的原因。之前我們使用字串去代表使用者地址,現在我們需要引入地址了。 1 地址密碼學 比特幣地址

公鑰密碼數字簽名

要實現數字簽名,可以使用公鑰密碼機制。 公鑰密碼包括一個由公鑰和私鑰組成的金鑰對,其中公鑰用於加密,私鑰用於解密。 整個過程如下圖: 數字簽名也同樣會使用公鑰和私鑰組成的金鑰對,不過這兩個金鑰的用法和公鑰密碼是相反的,即用私鑰加密相對於生成簽名,而用公鑰解密則相對於

PE檔案解析-異常處理表數字簽名

一、異常處理表 1.位置及概述     PE檔案頭可選映像頭中資料目錄表的第4成員IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION]指向異常處理表,它儲存在PE檔案中,通常在".pdata

數字證書數字簽名

數字證書: 在HTTPS客戶端與伺服器第一次互動時,服務端返回給客戶端的數字證書是讓客戶端驗證這個數字證書是不是服務端的,證書所有者是不是該伺服器,確保資料由正確的服務端發來,沒有被第三方篡改。數字證書可以保證數字證書裡的公鑰確實是這個證書的所有者(Subject)的,或

非對稱加密數字簽名

      非對稱加密具有一對鑰匙:公鑰和私鑰(都是唯一的)。其中公鑰用於加密,私鑰用於解密,經過公鑰加密過的資訊只有唯一配對的私鑰才可以解密。       加密過程:A在發信息之前,先接收到B的公鑰,然後A使用B的公鑰將資訊加密並傳送給B,B收到加密過的資訊後使用自己配

.NET Core加解密實戰系列之——訊息摘要數字簽名演算法

![](https://img2020.cnblogs.com/blog/2029875/202006/2029875-20200629172528304-1596961448.png) --- [TOC] ## 簡介 加解密現狀,編寫此係列文章的背景: - 需要考慮系統環境相容性問題(Linux、W

windows學習記錄----hello world窗口創建

wchar 得到 ret rbac text 對話框 round tab鍵 col 1.第一個程序:Hello,world! 1 #include<windows.h> 2 3 int WINAPI WinMain( HINSTANCE hInstan

數據挖掘讀書學習記錄

進行 習題 post class 12.1 挖掘 面向對象 數據 爬蟲 2017.12.1-至今: 1.<機器學習實戰>進行中 2.<統計學習方法>進行中 3.<集體智慧編程>進行中 2017.10.16-2017.11.30 1.&

學習記錄:gcc/g++ 編譯鏈接

分析 相互 you get 步驟 後臺開發 四個步驟 targe 生成 gcc/g++ 編譯與鏈接 編譯與鏈接的過程可以分解為四個步驟:預處理、編譯、匯編、鏈接 預處理:源代碼文件和相關的頭文件,被預處理器cpp預處理成一個後綴為 .i 的文件(選項:-E) 編譯:把預

JavaScript學習記錄day6-函數變量作用域、解構賦值方法

標準 只有一個 from 裝飾器 喜歡 賦值 全局 lang edge JavaScript學習記錄day6-函數變量作用域、解構賦值與方法 @(學習)[javascript] [TOC] 1. 作用域 在JavaScript中,用var申明的變量實際上是有作用域的。 如果

公鑰私鑰,數字簽名

bsp AC blog nbsp class hash OS 數據安全 log client (有w的公鑰) < --------------------------------------------------->

ELK學習記錄二 :elasticsearch、logstash及kibana的安裝配置

jre_home 支持 number yml num des 安裝包 soft filters 註意事項: 1.ELK版本要求5.X以上,本人使用版本:elasticsearch-6.0.0、kibana-6.0.0-linux-x86_64、logstash-6.0.0.

tses6學習記錄

rand font code 參數 obj ext 人才 cti star ts遵循es6語法,也是js以後發展的方向,學好ts對於以後都有幫助。 1.字符模板 以前對這個方法認知的還是太少了,直接上代碼吧。 var n1 = ‘1‘; var n2 = ‘2‘; va

JVM學習記錄-線程安全鎖優化(一)

多線程 image @param decimal 屬於 資源分配 try 可能 例如 前言 線程:程序流執行的最小單元。線程是比進程更輕量級的調度執行單位,線程的引入,可以把一個進程的資源分配和執行調度分開,各個線程既可以共享進程資源(內存地址、文件I/O等),又可以獨立

HtmlCSS學習記錄

HTML5新標籤和特性     *header:定義文件的頁首 頭部     *aside:定義其所處內容之外的內容 側邊     *article:定義文章。 <!DOCTYPE htm

HtmlCSS學習記錄

元素的顯示與隱藏 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <

(11)Spring學習記錄---Spring_bean(靜態,例項工廠FactoryBean建立Bean)

通過靜態工廠方法建立bean 1.Car.class  private String band; private double price; public Car(String band, double price) { super(); this.ban