1. 程式人生 > >雜湊(Hash)與加密(Encrypt)的基本原理、區別及工程應用

雜湊(Hash)與加密(Encrypt)的基本原理、區別及工程應用

0、摘要

      今天看到吉日嘎拉一篇關於管理軟體中資訊加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了資訊管理軟體中如何通過雜湊和加密進行資料保護。但是從文章評論中也可以看出很多朋友對這個方面一些基本概念比較模糊,這樣就容易“照葫蘆畫瓢”,不能根據自身具體情況靈活選擇和使用各種雜湊和加密方式。本文不對雜湊和加密做過於深入的討論,而是對雜湊和加密的基本概念和原理進行闡述、比較,並結合具體實踐說明如何選擇雜湊和加密演算法、如何提高安全性等問題,使朋友們做到“知其然,知其所以然”,這樣就能通過分析具體情況,靈活運用雜湊和加密保護資料。

1、雜湊(Hash)與加密(Encrypt)的區別

      在本文開始,我需要首先從直觀層面闡述雜湊(Hash)加密(Encrypt)的區別,因為我見過很多朋友對這兩個概念不是很清晰,容易混淆兩者。而正確區別兩者是正確選擇和使用雜湊與加密的基礎。

      概括來說,雜湊(Hash)是將目標文字轉換成具有相同長度的、不可逆的雜湊字串(或叫做訊息摘要),而加密(Encrypt)是將目標文字轉換成具有不同長度的、可逆的密文。

      具體來說,兩者有如下重要區別:

      1、雜湊演算法往往被設計成生成具有相同長度的文字,而加密演算法生成的文字長度與明文字身的長度有關。

      例如,設我們有兩段文字:“Microsoft”和“Google”。兩者使用某種雜湊演算法得到的結果分別為:“140864078AECA1C7C35B4BEB33C53C34”和“8B36E9207C24C76E6719268E49201D94”,而使用某種加密演算法的到的結果分別為“Njdsptpgu”和“Hpphmf”。可以看到,雜湊的結果具有相同的長度,而加密的結果則長度不同。實際上,如果使用相同的雜湊演算法,不論你的輸入有多麼長,得到的結果長度是一個常數,而加密演算法往往與明文的長度成正比。

      2、雜湊演算法是不可逆的,而加密演算法是可逆的。

      這裡的不可逆有兩層含義,一是“給定一個雜湊結果R,沒有方法將E轉換成原目標文字S”,二是“給定雜湊結果R,即使知道一段文字S的雜湊結果為R,也不能斷言當初的目標文字就是S”。其實稍微想想就知道,雜湊是不可能可逆的,因為如果可逆,那麼雜湊就是世界上最強悍的壓縮方式了——能將任意大小的檔案壓縮成固定大小。

      加密則不同,給定加密後的密文R,存在一種方法可以將R確定的轉換為加密前的明文S。

      這裡先從直觀層面簡單介紹兩者的區別,等下文從數學角度對兩者做嚴謹描述後,讀者朋友就知道為什麼會有這兩個區別了。

2、雜湊(Hash)與加密(Encrypt)的數學基礎

      從數學角度講,雜湊和加密都是一個對映。下面正式定義兩者:

      一個雜湊演算法是一個多對一對映,給定目標文字S,H可以將其唯一對映為R,並且對於所有S,R具有相同的長度。由於是多對一對映,所以H不存在逆對映

使得R轉換為唯一的S。

      一個加密演算法是一個一一對映,其中第二個引數叫做加密金鑰,E可以將給定的明文S結合加密金鑰Ke唯一對映為密文R,並且存在另一個一一對映,可以結合Kd將密文R唯一對映為對應明文S,其中Kd叫做解密金鑰。

      下圖是雜湊和加密過程的圖示:

      有了以上定義,就很清楚為什麼會存在上文提到的兩個區別了。由於雜湊演算法的定義域是一個無限集合,而值域是一個有限集合,將無限集合對映到有限集合,根據“鴿籠原理(Pigeonhole principle)”,每個雜湊結果都存在無數個可能的目標文字,因此雜湊不是一一對映,是不可逆的。

      而加密演算法是一一對映,因此理論上來說是可逆的。

      但是,符合上面兩個定義的對映僅僅可以被叫做雜湊演算法和加密演算法,但未必是好的雜湊和加密,好的雜湊和加密往往需要一些附加條件,下面介紹這些內容。

      一個設計良好的雜湊演算法應該很難從雜湊結果找到雜湊目標文字的碰撞(Collision)。那麼什麼是碰撞呢?對於一個雜湊演算法H,如果,則S1和S2互為碰撞。關於為什麼好的雜湊需要難以尋找碰撞,在下面講應用的時候會詳解。另外,好的雜湊演算法應該對於輸入的改變極其敏感,即使輸入有很小的改動,如一億個字元變了一個字元,那麼結果應該截然不同。這就是為什麼雜湊可以用來檢測軟體的完整性。

      一個設計良好的加密演算法應該是一個“單向陷門函式(Trapdoor one-way function)”,單向陷門函式的特點是一般情況下即使知道函式本身也很難將函式的值轉換回函式的自變數,具體到加密也就是說很難從密文得到明文,雖然從理論上這是可行的,而“陷門”是一個特殊的元素,一旦知道了陷門,則這種逆轉換則非常容易進行,具體到加密演算法,陷門就是金鑰。

      順便提一句,在加密中,應該保密的僅僅是明文和金鑰。也就是說我們通常假設攻擊者對加密演算法和密文了如指掌,因此加密的安全性應該僅僅依賴於金鑰而不是依賴於假設攻擊者不知道加密演算法。

3、雜湊(Hash)與加密(Encrypt)在軟體開發中的應用

      雜湊與加密在現代工程領域應用非常廣泛,在計算機領域也發揮了很大作用,這裡我們僅僅討論在平常的軟體開發中最常見的應用——資料保護。

      所謂資料保護,是指在資料庫被非法訪問的情況下,保護敏感資料不被非法訪問者直接獲取。這是非常有現實意義的,試想一個公司的安保系統資料庫伺服器被入侵,入侵者獲得了所有資料庫資料的檢視許可權,如果管理員的口令(Password)被明文儲存在資料庫中,則入侵者可以進入安保系統,將整個公司的安保設施關閉,或者刪除安保系統中所有的資訊,這是非常嚴重的後果。但是,如果口令經過良好的雜湊或加密,使得入侵者無法獲得口令明文,那麼最多的損失只是被入侵者看到了資料庫中的資料,而入侵者無法使用管理員身份進入安保系統作惡。

3.1、雜湊(Hash)與加密(Encrypt)的選擇

      要實現上述的資料保護,可以選擇使用雜湊或加密兩種方式。那麼在什麼時候該選擇雜湊、什麼時候該選擇加密呢?

      基本原則是:如果被保護資料僅僅用作比較驗證,在以後不需要還原成明文形式,則使用雜湊;如果被保護資料在以後需要被還原成明文,則需要使用加密。

      例如,你正在做一個系統,你打算當用戶忘記自己的登入口令時,重置此使用者口令為一個隨機口令,而後將此隨機口令發給使用者,讓使用者下次使用此口令登入,則適合使用雜湊。實際上很多網站都是這麼做的,想想你以前登入過的很多網站,是不是當你忘記口令的時候,網站並不是將你忘記的口令傳送給你,而是傳送給你一個新的、隨機的口令,然後讓你用這個新口令登入。這是因為你在註冊時輸入的口令被雜湊後儲存在資料庫裡,而雜湊演算法不可逆,所以即使是網站管理員也不可能通過雜湊結果復原你的口令,而只能重置口令。

      相反,如果你做的系統要求在使用者忘記口令的時候必須將原口令傳送給使用者,而不是重置其口令,則必須選擇加密而不是雜湊。

3.2、使用簡單的一次雜湊(Hash)方法進行資料保護

      首先我們討論使用一次雜湊進行資料保護的方法,其原理如下圖所示:

      對上圖我想已無需多言,很多朋友應該使用過類似的雜湊方法進行資料保護。當前最常用的雜湊演算法是MD5SHA1,下面給出在.NET平臺上用C#語言實現MD5和SHA1雜湊的程式碼,由於.NET對於這兩個雜湊演算法已經進行很很好的封裝,因此我們不必自己實現其演算法細節,直接呼叫相應的庫函式即可(實際上MD5和SHA1演算法都十分複雜,有興趣的可以參考維基百科)。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 using System; using System.Web.Security; namespace HashAndEncrypt { /// <summary> /// 雜湊(Hash)工具類 /// </summary> public sealed class HashHelper { /// <summary> /// 使用MD5演算法進行雜湊 /// </summary> /// <param name="source">源字串</param> /// <returns>雜湊字串</returns> public static string MD5Hash(string source) { return FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5"); }

相關推薦

(Hash)加密(Encrypt)的基本原理區別工程應用

0、摘要       今天看到吉日嘎拉的一篇關於管理軟體中資訊加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了資訊管理軟體中如何通過雜湊和加密進行資料保護。但是從文章評論中也可以看出很多朋友對這個方面一些基本概念比較模糊,這樣就容易“照葫蘆畫瓢”,不能根據自身具體情況靈活選擇和使

哈希(Hash)加密(Encrypt)的基本原理區別工程應用

class 區別 自己 裏的 lpad returns .net 角度 table 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論

【轉】哈希(Hash)加密(Encrypt)的基本原理區別工程應用

phy 理論 靈活運用 十分 實際應用 廣泛 tle 多網站 net 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論中也可以

演算法加密通訊數字簽名

作為通訊工程的學生,我在學習《資訊理論與編碼》這門課的時候瞭解過關於加密解密的一些知識,但覺得不夠深入,不甚過癮。 這幾天學習了跟密碼學有很大關聯的雜湊演算法,跟大家分享一下。   雜湊演算法是什麼       雜湊,英文為Hash,有時翻譯為雜湊,所以雜湊

SPII2CUART三種序列匯流排的原理區別應用

雜文 SPI、I2C、串列埠、我相信如果你是從事的是嵌入式開發,一定會用到這三種通訊協議,串列埠的話因為和波特率有關,所以一般的CPU或者MCU只會配有兩個或者三個串列埠,而資料的傳輸,的話SPI和I2C用得會比較多,下面找到了一篇部落格。轉過來、

九章演算法筆記 8.Hash & Heap

大綱 cs3k.com 資料結構概述 雜湊表 Hash: a.原理  b.應用 堆 Heap: a.原理    b.應用-優先佇列 Priority Queue  c.替代品-TreeMap   資料結構的兩類問題 cs3k

redis基本命令--(Hash)

1. 介紹 Redis hash 是一個string型別的field和value的對映表,hash特別適合用於儲存物件。 1.1例子 127.0.0.1:6379> HMSET runoobkey name "redis tutorial" d

雲盤秒傳原理的探討——查詢資料去重

P個重要的S:用雲盤存片的童鞋注意了,別以為你辛辛苦苦收集好幾年的片存到雲盤就高枕無憂了,根據“假秒傳,真共享”原則,你秒傳的檔案是非常不保險的,很容易被河蟹,已經有童鞋表示存到雲盤的片子被河蟹了。 自己多年的“勞動成果”很有可能突然化為烏有!!! 自己的“財產”突然被剝奪

ERPPDM整合基本原理

 2.1企業資源計劃(ERP)概述          MRP是60年代初在美國發展起來的一種新的生產管理技術。在該系統中使用物料清單(BOM)對系統的最終產品需求展開為製造過程對零部件和原材料的需求。在考慮現有儲存和生產提前期的前提下,下

Atititt java redis jedis 使用 Redis體系 Redis 命令 Redis 命令Redis 鍵(key)Redis 字串(String)Redis (Hash)R

Atititt java redis jedis  使用   Redis體系   Redis 命令 Redis 命令Redis 鍵(key)Redis 字串(String)Redis 雜湊(Hash)Redis 列表(List)Redis

Redis的(Hash)型別

        Redis是採用字典結構以key-value的形式儲存資料的,在雜湊型別(所謂的hash)中的value也是一種字典結構。如果用關係表結構去理解,就是key為物件,value是屬性和屬性值。如下圖: 所以使用雜湊(hash)型別,可以

資料結構之連結串列陣列

雜湊表 主要描述雜湊表的定義:通過關鍵碼尋找值的資料對映結構,類似於查字典 當存在雜湊衝突時,有兩種常用的方式:開發定址法和鏈地址法 開發定址法通俗的來說就是判斷該地址是否存資料,沒存就放進去,存了就找下一個地址,依次類推,問題是如果空間不足,無法處理衝突。 鏈地

字串[hash模板]

有這麼一類神奇的問題,給你一堆字串,然後問你有多少本質不同的字串 ~~ 或許有頭鐵的同志可以開一個map ~~ 所以有了hash大法 大致思想 我們判斷兩個字串相等,無非就是判斷他們每一位是不是相等,但是如果讓你判斷兩個數字是不是相等,是不是就簡單了許多呢?

【程式語言學習 2 】(轉發)表(散列表)原理詳解

什麼是雜湊表?(其實就是把字元通過雜湊函式轉化為索引)    雜湊表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式

基於VC++2010實現簽名驗證

                數字簽名即如何給一個計算機檔案進行簽字。數字簽字可以用對稱演算法實現,也可以用公鑰演算法實現。但前者除了檔案簽字者和檔案接受者雙方,還需要第三方認證,較麻煩;通過公鑰加密演算法的實現方法,由於用祕密金鑰加密的檔案,需要靠公開金鑰來解密,因此這可以作為數字簽名,簽名者用祕密金鑰加

字串(小象)

目錄   雜湊表基礎知識 雜湊表定義 1、字元雜湊 2、雜湊表排序整數 3、拉鍊表解決衝突,構造雜湊表 4、STL map中的常用操作 409、最長迴文串 290、單詞模式 49、字母異位詞分組 3、無重複字元的最長子串(滑動視窗的機制) 1

查詢增補

題目描述 給出一個數據序列,建立雜湊表,採用求餘法作為雜湊函式,模數為11,雜湊衝突用鏈地址法和表尾插入 如果首次查詢失敗,就把資料插入到相應的位置中 實現雜湊查詢與增補功能 輸入 第一行輸入n,表示有n個數據 第二行輸入n個數據,都是自然數且互不相同,資料之間用空格隔開 第三行

表(散列表)原理詳解

什麼是雜湊表? 雜湊表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這

Kafka簡介基本原理執行流程使用場景

一、簡介 Apache Kafka是分散式釋出-訂閱訊息系統,在 kafka官網上對 kafka 的定義:一個分散式釋出-訂閱訊息傳遞系統。 它最初由LinkedIn公司開發,Linkedin於2010年貢獻給了Apache基金會併成為頂級開源專案。Kafka

perlhash的常見用法介紹

基本用法 #初始化%h為空陣列 %h={}; #用陣列初始化%h為a=>1,b=>2  %h=('a',1,'b',2); #意義同上,只是另一種更形象化的寫法。%h=('a'=>1,'b'=>2); #如果key是字串,可以省略引號。下面這行和上面