當你在乙個紙質檔案上寫上你的名字,按上你的指紋,就意味著這張紙上的內容經過了你的認可,你的筆跡和指紋就是你身份的證明。這是因為,筆跡很難偽造,而每個人的指紋更是獨一無二的。在簽名前,我們會檢查檔案內容有沒有歧義、有沒有塗改、有沒有多餘不必要的空白等,確認無誤後再寫下我們的名字,而收到簽名後檔案的人,再次對檔案內容及簽名進行檢查,以確保檔案內容的有效性和完整性。
因此,簽名可以用來認證簽名者的身份及確保被簽名檔案內容的真實性。
在學習數字簽名之前,需要先了解以下幾個概念:
1、hash演算法
hash,一般翻譯做雜湊或音譯為雜湊,簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。常用的hash演算法有:md5,sha1,sha256等。
比如,「我是小新,我喜歡吃青椒,大姐姐你呢?」這句話的md5值為:
f282c0e90871ac370c57c1539d3cfdb6
如果把這句話最後乙個問號改為句號,則md5值為:
1515c89b2f8734049846e542b2cfaab8
哪怕只修改乙個字元,雜湊值也會不一樣,因此,md5這類雜湊演算法通常用來驗證內容有沒有被篡改。
另外,總有人認為md5是用來加密的,這是不對的,有加密就有解密,而md5是不可逆向的,我們通常把使用者輸入的密碼用md5計算後儲存到資料庫,這確實起到了一定的「加密」的作用,因為資料庫裡儲存的確實不是使用者明文密碼了,但是,沒有人可以通過這個密文反推使用者真實的密碼,也就是說,不存在所謂的md5「解密」。網上所謂的一些md5破解,不過是用字典來匹配罷了,同乙個字串的md5值是不會變的,因此只要有乙個明文密碼和其md5值的字典,就可以用md5值找其對應的明文密碼,不過也不用擔心,在儲存使用者名稱密碼的時候加隨機鹽就能解決這個匹配的問題。2023年王小雲教授證明了md5可以碰撞,即兩個完全不同的字串可能計算出完全一樣的hash值,但跟破解沒半毛錢關係。
2、對稱加密
對稱的意思是,加密和解密使用同乙個金鑰,常用演算法有aes、rc4、3des等。
在諜戰劇裡,通常會有乙個密碼本(明文和密文對應關係列出來),在前些年很火的電視劇集《潛伏》裡,餘則成就有乙個密碼本,每次收到密碼後在紙上寫下來,然後翻開密碼本找對應的明文,只要這個密碼本不洩露,軍統的那些人就破解不了他的密碼。當然,在現實裡,即使密碼本沒有洩露,為了保證安全,地下工作者也可能會不定期更換密碼本。
還有乙個真實的事件:在抗日戰爭時期,有一段時間,重慶每天遭受日機多架次的狂轟濫炸,高射炮每次都打不下來,日軍的飛機總在高射炮的射程之外,後來密碼學專家破譯了乙個叫獨臂大盜的間諜傳送給日軍的電報,他是一名高射炮團的營長,他用電報機傳送密文將高射炮的射程告訴了日軍,他的密碼本是諾貝爾文學獎獲得者賽珍珠的長篇**《大地》,書的頁碼是密文,每一頁的第乙個單詞是明文,他用電報機傳送頁碼給日軍,日軍情報部門用頁碼找對應的英文單詞,這樣,就完成了情報的加密和解密。
3、非對稱加密
非對稱加密即加密和解密使用的不是同乙個金鑰,而是乙個金鑰對,金鑰對包含乙個公鑰和乙個私鑰,它的原理是找幾個很大的質數進行一些數**算,這些質數滿足一定的數學關係。常用非對稱加密演算法有rsa,dsa/dss等。
下面舉例說明什麼是數字簽名和數字證書:
小張考上了北京大學,小李進了中等技術學校,小紅在百貨公司當售貨員:他們都有光明的前途。這些都不重要,重要的是小張和小李都喜歡小紅。
1、小紅有兩把鑰匙,一把是公鑰,另一把是私鑰。小紅把公鑰送給小張和小李各一把。
2、小張給小紅寫信,然後用公鑰加密,小紅收到信以後用私鑰解密,得到信的內容:「我們在一起吧!」。
3、小紅給小張回信,她決定進行數字簽名,她先用hash函式(如md5)計算信的摘要,然後再用私鑰把摘要也加密,生成乙個數字簽名,再把信也加密,最後把簽名放到信的後面一起發給小張。
4、小張收到信以後用公鑰解密,得到信的內容:「好!」,然後用公鑰解開信後面的數字簽名,可以得到資訊摘要,證明信確實是小紅寫的,然後自己再用md5計算一下信的資訊摘要,跟前面得到的摘要相等,證明信沒有被修改過。
5、這跟小李有什麼關係呢?這就有了,小李自學黑客知識,黑進了小張電腦,由於小李也有一把公鑰,所以他也可以解密,看到了回信內容。
6、惱羞成怒的小李決定破壞他們的感情,於是小李自己生成了一對公鑰和私鑰,然後用自己的公鑰替換了小張的公鑰,然後冒充小紅寫信給小張,並用自己的私鑰加密。
7、小張收到信後,用公鑰(已經被替換為小李的公鑰)解密,得到信的內容:「我們分手吧!」。小張懵了,而小李一臉奸笑。
8、小張坐火車去找小紅,結果兩人發現那封信是被人冒充了,小張的公鑰被替換了,不是小紅的,那怎麼保證小張擁有的公鑰確實是小紅的呢?小紅跑到證書機構(ca)給自己的公鑰做認證,證書機構也有一對公鑰和私鑰,證書機構用自己的私鑰對小紅的公鑰及小紅的個人資訊等進行加密,得到乙個數字證書。
9、小紅再次給小張寫信,簽名、加密,並把簽名和數字證書一起發給小張。
10、小張拿到數字證書,用ca的公鑰解開證書,得到正確的小紅的公鑰,然後就可以解密信的內容和驗證簽名。
再看乙個https的例子,過程大致如下:
1、客戶端請求服務端,告訴服務端自己支援的加密方法
2、服務端傳送證書鏈給客戶端
3、客戶端驗證證書鏈的有效性,比如證書是否過期,證書的網域名稱是否是當前請求的網域名稱等
4、證書驗證有效後開始協商對稱金鑰,客戶端用非對稱加密方法如rsa加密協商好的對稱金鑰,然後傳送給服務端
5、之後開始用對稱金鑰通訊
注意,因為非對稱演算法相對複雜,計算耗時,所以非對稱加密只用來加密協商好的對稱金鑰,保證這個對稱金鑰在傳輸過程中不被洩露。
數字證書的作用,是保證你可以獲取到正確的公鑰。有了正確的公鑰,才能保證資訊的正確性、安全性、完整性。
數字證書需要去證書機構(ca)申請,證書機構也有一對公鑰和私鑰,證書機構用自己的私鑰對你的資訊(比如ssl證書中包含了證書版本、序列號、使用的演算法、頒發機構、網域名稱、證書過期時間、網域名稱所有者等等)加密,得到乙個屬於你的數字證書。
ca下面還可以有二級甚至**、四級等ca機構,每一級ca自己的證書從上一級申請,這樣一級一級相互保證,形成乙個證書鏈,最頂級的證書叫根證書,根證書由根證書頒發機構自己給自己頒發,叫自簽證書。根ca有最高的權威性,這些ca的公鑰可以在網上查到,因此無法偽造。作業系統以及一些瀏覽器通常內建了一些根證書頒發機構頒發的證書。
ssl證書的驗證
瀏覽器在收到伺服器傳送過來的證書鏈後,呼叫證書驗證函式去驗證,只要根證書是有效的,則整個證書鏈都沒有問題,否則瀏覽器會給出證書有問題之類的警告。
這是谷歌瀏覽器的證書:
數字證書格式
證書檔案的結構也是有標準的,比如檔案裡包含什麼資訊,用什麼編碼,第一行記錄什麼,第二行記錄什麼等等,詳情看這裡。
x.509
基本的證書格式,只包含公鑰。
x509證書由使用者公共金鑰和使用者識別符號組成。此外還包括版本號、證書序列號、ca識別符號、簽名演算法標識、簽發者名稱、證書有效期等資訊。
pkcs#7
public key cryptography standards #7。
pkcs#7一般把證書分成兩個檔案,乙個公鑰、乙個私鑰,有pem和der兩種編碼方式。pem比較多見,是純文字的,一般用於分發公鑰,看到的是一串可見的字串,通常以.crt,.cer,.key為檔案字尾。der是二進位制編碼。
pkcs#7一般主要用來做數字信封。
數字簽名和數字證書
到底什麼是 數字簽名 digital signature 和 數字證書 digital certificate 對這些問題的理解,一直模模糊糊,很多細節搞不清楚。今天,讀完一篇 通俗易懂的文章後,思路豁然開朗。為了加深記憶,這篇文章的翻譯版記錄如下。1.鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰。2....
數字簽名和數字證書
其實數字簽名的概念很簡單。大家知道,要確保可靠通訊,必須要解決兩個問題 首先,要確定訊息的 確實是其申明的那個人 其次,要保證資訊在傳遞的過程中不被第三方篡改,即使被篡改了,也可以發覺出來。所謂數字簽名,就是為了解決這兩個問題而產生的,它是對前面提到的非對稱加密技術 與數字摘要 技術的乙個具體的應用...
數字簽名和數字證書
英文 為 到底什麼是 數字簽名 digital signature 和 數字證書 digital certificate 對這些問題的理解,一直模模糊糊,很多細節搞不清楚。今天,讀完一篇 通俗易懂的文章後,思路豁然開朗。為了加深記憶,這篇文章的翻譯版記錄如下。1.鮑勃有兩把鑰匙,一把是公鑰,另一把是...