前言
我們都知道信息在網絡中的安全傳輸,其核心是依托于各種加解密機制,發送方的明文通過加密算法轉為密文,再通過網絡傳輸給接收方,接收方再通過解密算法將密文還原為明文。目前應用最廣的加解密機制是 對稱加密
和 非對稱加密
。
加密能保證數據以密文的形式在網絡中傳輸,但密鑰本質上也是一段明文數據,如果密鑰的發放是線下進行的(即數據交換的雙方是面對面通過U盤等物理介質交換密鑰),那這個過程中的安全性是沒有問題的。但絕大多數情況下,密鑰必須通過網絡發放,因此密鑰的發放本身又是另一個信息安全傳輸的問題,如果這個問題得不到解決,那經由密鑰加密過的數據,也只不過是換了種形式在網絡上裸奔。
密鑰的安全發放,就要依托于數字證書和數字簽名技術了,下面詳細介紹。
消息摘要 - Message Digest
消息摘要(Message Digest),又稱數字摘要(Digital Digest)或數字指紋(Finger Print)。簡單來說,消息摘要就是在消息數據上,執行一個單向的Hash函數,生成一個固定長度的Hash值,這個Hash值即是消息摘要。關于這個Hash函數,我們來看看維基百科上的定義(https://en.wikipedia.org/wiki/Cryptographic_hash_function):
A cryptographic hash function is a special class of hash function that has certain properties which make it suitable for use in cryptography. It is a mathematical algorithm that maps data of arbitrary size to a bit string of a fixed size (a hash function) which is designed to also be a one-way function, that is, a function which is infeasible to invert. The only way to recreate the input data from an ideal cryptographic hash function's output is to attempt a brute-force search of possible inputs to see if they produce a match, or use a rainbow table of matched hashes. Bruce Schneier has called one-way hash functions "the workhorses of modern cryptography".[1] The input data is often called the message, and the output (the hash value or hash) is often called the message digest or simply the digest.
The ideal cryptographic hash function has five main properties:
- it is deterministic so the same message always results in the same hash
- it is quick to compute the hash value for any given message
- it is infeasible to generate a message from its hash value except by trying all possible messages
- a small change to a message should change the hash value so extensively that the new hash value appears uncorrelated with the old hash value
- it is infeasible to find two different messages with the same hash value
Cryptographic hash functions have many information-security applications, notably in digital signatures, message authentication codes (MACs), and other forms of authentication. They can also be used as ordinary hash functions, to index data in hash tables, for fingerprinting, to detect duplicate data or uniquely identify files, and as checksums to detect accidental data corruption. Indeed, in information-security contexts, cryptographic hash values are sometimes called (digital) fingerprints, checksums, or just hash values, even though all these terms stand for more general functions with rather different properties and purposes.
A cryptographic hash function (specifically SHA-1) at work. A small change in the input (in the word "over") drastically changes the output (digest). This is the so-called avalanche effect.
上面提到的的加密Hash函數就是消息摘要算法。它有以下特征:
- 無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應用MD5算法摘要的消息有128個比特位,用SHA-1算法摘要的消息最終有160比特位的輸出,SHA-1的變體可以產生192比特位和256比特位的消息摘要。一般認為,摘要的最終輸出越長,該摘要算法就越安全。
- 消息摘要看起來是“隨機的”。這些比特看上去是胡亂的雜湊在一起的。可以用大量的輸入來檢驗其輸出是否相同,一般,不同的輸入會有不同的輸出,而且輸出的摘要消息可以通過隨機性檢驗。但是,一個摘要并不是真正隨機的,因為用相同的算法對相同的消息求兩次摘要,其結果必然相同;而若是真正隨機的,則無論如何都是無法重現的。因此消息摘要是“偽隨機的”。
- 消息摘要函數是單向函數,即只能進行正向的信息摘要,而無法從摘要中恢復出任何的消息,甚至根本就找不到任何與原信息相關的信息。當然,可以采用強力攻擊的方法,即嘗試每一個可能的信息,計算其摘要,看看是否與已有的摘要相同,如果這樣做,最終肯定會恢復出摘要的消息。但實際上,要得到的信息可能是無窮個消息之一,所以這種強力攻擊幾乎是無效的。
- 好的摘要算法,沒有人能從中找到“碰撞”,雖然“碰撞”是肯定存在的(由于長明文生成短摘要的Hash必然會產生碰撞)。即對于給定的一個摘要,不可能找到一條信息使其摘要正好是給定的。或者說,無法找到兩條消息,使它們的摘要相同。
正是由于以上特點,消息摘要算法被廣泛應用在“數字簽名”領域,作為對明文的摘要算法。著名的消息摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的變體。
數字簽名 - Signature
數字簽名方案是一種以電子形式存儲消息簽名的方法。一個完整的數字簽名方案應該由兩部分組成:簽名算法和驗證算法。在講數字簽名之前,我們先簡單介紹幾個相關知識點:“公鑰密碼體制”、“對稱加密算法”、“非對稱加密算法”。
公鑰密碼體制(public-key cryptography)
公鑰密碼體制分為三個部分,公鑰、私鑰、加密解密算法,它的加密解密過程如下:
- 加密:通過加密算法和公鑰對內容(或者說明文)進行加密,得到密文。加密過程需要用到公鑰。
- 解密:通過解密算法和私鑰對密文進行解密,得到明文。解密過程需要用到解密算法和私鑰。注意,由公鑰加密的內容,只能由私鑰進行解密,也就是說,由公鑰加密的內容,如果不知道私鑰,是無法解密的。
公鑰密碼體制的公鑰和算法都是公開的(這是為什么叫公鑰密碼體制的原因),私鑰是保密的。大家都可以使用公鑰進行加密,但是只有私鑰的持有者才能解密。在實際的使用中,有需要的人會生成一對公鑰和私鑰,把公鑰發布出去給別人使用,自己保留私鑰。目前使用最廣泛的公鑰密碼體制是RSA密碼體制。
對稱加密算法(symmetric key algorithms)
在對稱加密算法中,加密和解密都是使用的同一個密鑰。因此對稱加密算法要保證安全性的話,密鑰要做好保密,只能讓使用的人知道,不能對外公開。
非對稱加密算法(asymmetric key algorithms)
在非對稱加密算法中,加密使用的密鑰和解密使用的密鑰是不相同的。前面所說的公鑰密碼體制就是一種非對稱加密算法,他的公鑰和是私鑰是不能相同的,也就是說加密使用的密鑰和解密使用的密鑰不同,因此它是一個非對稱加密算法。
RSA簡介
RSA密碼體制是一種公鑰密碼體制,公鑰公開,私鑰保密,它的加密解密算法是公開的。 由公鑰加密的內容可以并且只能由私鑰進行解密,而由私鑰加密的內容可以并且只能由公鑰進行解密。也就是說,RSA的這一對公鑰、私鑰都可以用來加密和解密,并且一方加密的內容可以由并且只能由對方進行解密。
- 加密:公鑰加密,私鑰解密的過程,稱為“加密”。因為公鑰是公開的,任何公鑰持有者都可以將想要發送給私鑰持有者的信息進行加密后發送,而這個信息只有私鑰持有者才能解密。
- 簽名:私鑰加密,公鑰解密的過程,稱為“簽名”。它和加密有什么區別呢?因為公鑰是公開的,所以任何持有公鑰的人都能解密私鑰加密過的密文,所以這個過程并不能保證消息的安全性,但是它卻能保證消息來源的準確性和不可否認性,也就是說,如果使用公鑰能正常解密某一個密文,那么就能證明這段密文一定是由私鑰持有者發布的,而不是其他第三方發布的,并且私鑰持有者不能否認他曾經發布過該消息。故此將該過程稱為“簽名”。
數字簽名
事實上,任何一個公鑰密碼體制都可以單獨地作為一種數字簽名方案使用。如RSA作為數字簽名方案使用時,可以定義如下:
這種簽名實際上就是用信源的私鑰加密消息,加密后的消息即成了簽體;而用對應的公鑰進行驗證,若公鑰解密后的消息與原來的消息相同,則消息是完整的,否則消息不完整。它正好和公鑰密碼用于消息保密是相反的過程。因為只有信源才擁有自己地私鑰,別人無法重新加密源消息,所以即使有人截獲且更改了源消息,也無法重新生成簽體,因為只有用信源的私鑰才能形成正確地簽體。同樣信宿只要驗證用信源的公鑰解密的消息是否與明文消息相同,就可以知道消息是否被更改過,而且可以認證消息是否是確實來自意定的信源,還可以使信源不能否認曾經發送的消息。所以這樣可以完成數字簽名的功能。
但這種方案過于單純,它僅可以保證消息的完整性,而無法確保消息的保密性。而且這種方案要對所有的消息進行加密操作,這在消息的長度比較大時,效率是非常低的,主要原因在于公鑰體制的加解密過程的低效性。所以這種方案一般不可取。
幾乎所有的數字簽名方案都要和快速高效的摘要算法(Hash函數)一起使用,當公鑰算法與摘要算法結合起來使用時,便構成了一種有效地數字簽名方案。
這個過程是:
- 用摘要算法對消息進行摘要。
- 再把摘要值用信源的私鑰加密。
通過以上兩步得到的消息就是所謂的原始信息的數字簽名,發送者需要將原始信息和數字簽名一同發送給接收者。而接收者在接收到原始信息和數字簽名后,通過以下3步驗證消息的真偽:
- 先把接收到的原始消息用同樣的摘要算法摘要,形成“準簽體”。
- 對附加上的那段數字簽名,使用預先得到的公鑰解密。
- 比較前兩步所得到的兩段消息是否一致。如果一致,則表明消息確實是期望的發送者發的,且內容沒有被篡改過;相反,如果不一致,則表明傳送的過程中一定出了問題,消息不可信。
這種方法使公鑰加密只對消息摘要進行操作,因為一種摘要算法的摘要消息長度是固定的,而且都比較“短”(相對于消息而言),正好符合公鑰加密的要求。這樣效率得到了提高,而其安全性也并未因為使用摘要算法而減弱。
綜上所述,數字簽名是非對稱加密技術 + 消息摘要技術的結合。
數字證書 - Certificate
通過數字簽名技術,確實可以解決可靠通信的問題。一旦驗簽通過,接收者就能確信該消息是期望的發送者發送的,而發送者也不能否認曾經發送過該消息。大家有沒有注意到,前面講的數字簽名方法,有一個前提,就是消息的接收者必須事先得到正確的公鑰。如果一開始公鑰就被別人篡改了,那壞人就會被你當成好人,而真正的消息發送者給你發的消息會被你視作無效的。而且,很多時候根本就不具備事先溝通公鑰的信息通道。那么如何保證公鑰的安全可信呢?這就要靠數字證書來解決了。
數字證書是一個經證書授權(Certificate Authentication)中心數字簽名的包含公鑰擁有者信息以及公鑰的文件。數字證書的格式普遍采用的是X.509V3國際標準,一個標準的X.509數字證書通常包含以下內容:
- 證書的發布機構(Issuer)
- 該證書是由哪個機構(CA中心)頒發的。
- 證書的有效期(Validity)
- 證書的有效期,或者說使用期限。過了該日期,證書就失效了。
- 證書所有人的公鑰(Public-Key)
- 該證書所有人想要公布出去的公鑰。
- 證書所有人的名稱(Subject)
- 這個證書是發給誰的,或者說證書的所有者,一般是某個人或者某個公司名稱、機構的名稱、公司網站的網址等。
- 證書所使用的簽名算法(Signature algorithm)
- 這個數字證書的數字簽名所使用的加密算法,這樣就可以使用證書發布機構的證書里面的公鑰,根據這個算法對指紋進行解密。
- 證書發行者對證書的數字簽名(Thumbprint)
- 也就是該數字證書的指紋,用于保證數字證書的完整性,確保證書沒有被修改過。其原理就是在發布證書時,CA機構會根據簽名算法(Signature algorithm)對整個證書計算其hash值(指紋)并和證書放在一起,使用者打開證書時,自己也根據簽名算法計算一下證書的hash值(指紋),如果和證書中記錄的指紋對的上,就說明證書沒有被修改過。
可以看出,數字證書本身也用到了數字簽名技術,只不過簽名的內容是整個證書(里面包含了證書所有者的公鑰以及其他一些內容)。與普通數字簽名不同的是,數字證書的簽名者不是隨隨便便一個普通機構,而是CA機構。這就好像你的大學畢業證書上簽名的一般都是德高望重的校長一樣。一般來說,這些CA機構的根證書已經在設備出廠前預先安裝到了你的設備上了。所以,數字證書可以保證證書里的公鑰確實是這個證書所有者的,或者證書可以用來確認對方的身份。可見,數字證書主要是用來解決公鑰的安全發放問題。
綜上所述,總結一下,數字簽名和簽名驗證的大體流程如下圖所示: