2. 簽名的生成和驗證
3. 數字簽名的方法
4. 數字簽名無法解決的問題
「數字簽名 — 訊息到底是誰寫的」
數字簽名是一種將相當於現實世界中的蓋章、簽字的功能在計算機世界中進行實現的技術。使用數字簽名可以識別篡改和偽裝,還可以防止否認。
通過上篇中介紹的訊息認證碼,可以識別訊息是否被篡改或者傳送者身份是否被偽裝,也就是可以校驗訊息的完整性,還可以對訊息進行認證。然而,比如在出具借條的場景中卻無法使用訊息認證碼,因為訊息認證碼無法防止否認。
訊息認證碼之所以無法防止否認,是因為訊息認證碼需要在傳送者alice和接收者bob兩者之間共享同乙個金鑰。正是因為金鑰是共享的,所以能夠使用訊息認證碼計算出正確mac值的並不只有傳送者alice,接收者bob也可以計算出正確的mac值。由於alice和bob雙方都能夠計算出正確的mac值,因此對於第三方來說,我們無法證明這條訊息的確是由alice生成的。
假設alice使用的金鑰是乙個只有alice自己才知道的私鑰。當alice傳送訊息時,她用私鑰生成乙個「簽名"。相對地,接收者bob則使用乙個和alice不同的金鑰對簽名進行驗證。使用bob的金鑰無法根據訊息生成簽名,但是用bob的金鑰卻可以對alice所計算的簽名進行驗證,也就是說可以知道這個簽名是否是通過alice的金鑰計算出來的。如果真有這麼一種方法的話,那麼不管是識別篡改、偽裝還是防止否認就都可以實現了吧 ?
實際上,這種看似很神奇的技術早就已經問世了,這就是數字簽名(digital signat.ure)。
生成訊息簽名這一行為是由訊息的傳送者alice來完成的,也稱為「對訊息簽名」。生成簽名就是根據訊息內容計算數字簽名的值,這個行為意味著 「我認可該訊息的內容"。
驗證數字簽名這一行為一般是由訊息的接收者bob來完成的,但也可以由需要驗證訊息的第三方來完成,這裡的第三方我們暫且將其命名為驗證者victor。驗證簽名就是檢查該訊息的簽名是否真的屬於alice,驗證的結果可以是成功或者失敗,成功就意味著這個簽名是屬於alice的,失敗則意味著這個簽名不是屬於alice的。
在數字簽名中,生成簽名和驗證簽名這兩個行為需要使用各自專用的金鑰來完成。
alice使用「簽名金鑰"來生成訊息的簽名,而bob和victor則使用「驗證金鑰"來驗證訊息的簽名。數字簽名對簽名金鑰和驗證金鑰進行了區分,使用驗證金鑰是無法生成簽名的。這一點非常重要。此外,簽名金鑰只能由簽名的人持有,而驗證金鑰則是任何需要驗證簽名的人都可以持有。
上述的這部分內容,是不是覺得似曾相識呢?
沒錯,這就是我們講過的非對稱加密。公鑰密碼和上面講的數字簽名的結構非常相似。在非對稱加密中,金鑰分為加密金鑰和解密金鑰,用加密金鑰無法進行解密。此外,解密金鑰只能由需要解密的人持有,而加密金鑰則是任何需要加密的人都可以持有。你看,數字簽名和非對稱加密是不是很像呢?
實際上,數字簽名和非對稱加密有著非常緊密的聯絡,簡而言之,數字簽名就是通過將非對稱加密 「反過來用」 而實現的。下面我們來將金鑰的使用方式總結成一張表:
私鑰公鑰
非對稱加密
接收者解密時使用
傳送者加密時使用
數字簽名
簽名者生成簽名時使用
驗證者驗證簽名時使用
誰持有秘鑰?
個人持有
只要需要,任何人都可以持有
如何簽名?
直接對訊息簽名的方法比較容易理解,但實際上並不會使用;對訊息的雜湊值簽名的方法稍微複雜一點,但實際中一般都使用這種方法。
使用直接對訊息簽名的方法,需要對整個訊息進行加密,非常耗時,這是因為非對稱加密演算法本來就非常慢。那麼,我們能不能生成一條很短的資料來代替訊息本身呢?這就是單向雜湊函式。
於是我們不必再對整個訊息進行加密(即對訊息簽名),而是只要先用單向雜湊函式求出訊息的雜湊值,然後再將雜湊值進行加密(對雜湊值簽名)就可以了。無論訊息有多長,雜湊值永遠都是這麼短,因此對其進行加密(簽名)是非常輕鬆的。
alice用單向雜湊函式計算訊息的雜湊值。
alice用自己的私鑰對雜湊值進行加密。
用私鑰加密雜湊值所得到的密文就是alice對這條雜湊值的簽名,由於只有alice才持有自己的私鑰因此除了alice以外,其他人是無法生成相同的簽名(密文)的。
alice將訊息和簽名傳送給bob。
bob用alice的公鑰對收到的簽名進行解密
如果收到的簽名確實是用alice的私鑰進行加密而得到的密文(簽名),那麼用alice的公鑰應該能夠正確解密,解密的結果應該等於訊息的雜湊值。如果收到的簽名不是用alice的私鑰進行加密而得到的密文,那麼就無法用alice的公鑰正確解密(解密後得到的資料看起來是隨機的)。
bob將簽名解密後得到的雜湊值與alice直接傳送的訊息的雜湊值進行對比。
如果兩者一致,則簽名驗證成功;如果兩者不一致,則簽名驗證失敗。
我們將數字簽名中生成簽名和驗證簽名的過程整理成一張時間流程圖 。
用數字簽名既可以識別出篡改和偽裝,還可以防止否認。也就是說,我們同時實現了確認訊息的完整性、進行認證以及否認防止。現代社會中的計算機通訊從這一技術中獲益匪淺。
然而,要正確使用數字簽名,有乙個大前提,那是用於驗證簽名的公鑰必須屬於真正的傳送者。即便數字簽名演算法再強大,如果你得到的公鑰是偽造的,那麼數字簽名也會完全失效。
現在我們發現自己陷人了乙個死迴圈一一一數字簽名是用來識別訊息篡改、偽裝以及否認的,但是為此我們又必須從沒有被偽裝的傳送者得到沒有被篡改的公鑰才行。
為了能夠確認自己得到的公鑰是否合法,我們需要使用證書。所謂證書,就是將公鑰當作一條訊息,由乙個可信的第三方對其簽名後所得到的公鑰。
當然,這樣的方法只是把問題轉移了而已。為了對證書上施加的數字簽名進行驗證,我們必定需要另乙個公鑰,那麼如何才能構築乙個可信的數字簽名鏈條呢?又由誰來頒發可信的證書呢?到這一步,我們就已經踏人了社會學的領域。我們需要讓公鑰以及數字簽名技術成為一種社會性的基礎設施,即公鑰基礎設施(public key intrastructure),簡稱pkio關於證書和pki下篇繼續。
數字簽名原理
數字簽名是一種確保資料完整性和原始性的方法。數字簽名可以提供有力的證據,表明自從資料被簽名以來資料尚未發生更改,並且它可以確認對資料簽名的人或實體的身份。數字簽名實現了 完整性 和 認可性 這兩項重要的安全功能,而這是實施安全電子商務的基本要求。當資料以明文或未加密形式分發時,通常使用數字簽名。在這...
數字簽名原理
數字簽名是一種確保資料完整性和原始性的方法。數字簽名可以提供有力的證據,表明自從資料被簽名以來資料尚未發生更改,並且它可以確認對資料簽名的人或實體的身份。數字簽名實現了 完整性 和 認可性 這兩項重要的安全功能,而這是實施安全電子商務的基本要求。當資料以明文或未加密形式分發時,通常使用數字簽名。在這...
數字簽名原理
數字簽名是一種確保資料完整性和原始性的方法。數字簽名可以提供有力的證據,表明自從資料被簽名以來資料尚未發生更改,並且它可以確認對資料簽名的人或實體的身份。數字簽名實現了 完整性 和 認可性 這兩項重要的安全功能,而這是實施安全電子商務的基本要求。當資料以明文或未加密形式分發時,通常使用數字簽名。在這...