密碼學/數字簽名
截至 2014 年,安裝應用程式可能是人們使用數字簽名的最常見方式。Android 和 iOS 都要求應用程式在安裝之前進行數字簽名。[1][2]
密碼學通常用於提供有關訊息的某種保證。這種保證可以是以下四種一般形式中的一種或多種。這些形式是訊息的機密性、完整性、身份驗證和不可否認性。在公鑰加密出現之前,密碼學通常只用於提供機密性,即通訊被加密以保持其內容的秘密。這種加密通常意味著傳送者知道使用的方案和金鑰,因此提供了一些基本的身份驗證。現代數字簽名在提供身份驗證、完整性和不可否認性保證方面比傳統的對稱金鑰加密方案要好得多。
數字簽名依賴於公鑰簽名演算法對訊息進行簽名的能力——使用私鑰從訊息生成簽名。之後,任何擁有該簽名的人都可以使用相應的公鑰驗證訊息。(這使用與公鑰加密和公鑰解密相反的順序來提供機密性——使用公鑰加密,並且只能使用私鑰解密)。但是,為了提供數字簽名,簽名者必須使用其私鑰來簽署他想要使用其私鑰簽署的訊息——或該訊息的某些表示——以便任何知道其公鑰的人可以使用它來驗證只有他的私鑰才能簽署該訊息。
在正確實施中,有一些相關的細節。
首先,如果接收者沒有簽名者公鑰的已驗證副本,則簽名本身毫無用處。雖然面對面交換該金鑰可能是最好的方法,但這通常是不可能的。因此,許多公鑰基礎設施要求建立證書頒發機構,其公鑰透過某種可信方法預先共享。一個例子是像 VeriSign 這樣的 SSL CA,其證書由計算機制造商預先安裝在大多數流行的瀏覽器中。CA 是所謂的可信第三方,它是所有參與加密通訊的各方都信任的個人或組織。該組織的職責是保證其私鑰的安全和秘密,並使用該金鑰來簽署其已驗證的個人的公鑰。換句話說,為了避免與您希望與之通訊的每個人面對面交換金鑰的麻煩,您可能會聘請可信第三方的服務,您已經擁有其公鑰,以便與這些個人面對面交流。然後,第三方可以簽署公鑰並將其傳送給您,這樣您就可以獲得已驗證的副本,而無需面對面交換每個金鑰對。簽名本身的細節我們將在稍後討論。
透過PGP或GPG進行安全電子郵件傳輸的另一種常用方法被稱為信任網路。信任網路類似於建立證書頒發機構,主要區別在於它不那麼正式。與其建立一個組織來充當可信第三方,不如讓個人簽署他們已與之面對面會面的其他個人的金鑰。以這種方式,如果 Alice 有 Bob 的金鑰,而 Bob 簽署了 Charlie 的金鑰,那麼 Alice 可以信任 Charlie 的金鑰。顯然,這可以在非常複雜的網路中擴充套件,但這種能力也是一個很大的弱點;網路中一個被破壞的個人——信任鏈中最薄弱的環節——會使其餘部分變得毫無用處。
簽名的實際實現也可能有所不同。人們可以透過使用其私鑰對訊息進行加密來簡單地簽署訊息——它可以透過其公鑰解密,並且有效加密的行為只能由該秘密金鑰執行,從而證明其身份。但是,人們通常可能想要簽署而不加密訊息。為了在基本級別提供此功能,人們可以傳送訊息的兩個副本,其中一個副本將被加密。如果讀者想要驗證他閱讀的未加密訊息是否有效,他可以解密副本並比較兩者。但是,即使這種方法也很麻煩;它使每條訊息的大小增加了一倍。為了避免這種缺點,大多數實現使用雜湊函式來生成訊息的雜湊值,並使用私鑰加密該雜湊值。這提供了與加密副本幾乎相同的安全性,但節省了空間。
許多早期對公鑰簽名演算法的解釋將公鑰簽名演算法描述為“使用私鑰加密訊息”。然後,他們將公鑰訊息驗證演算法描述為“使用公鑰解密”。許多人更喜歡將現代公鑰密碼系統描述為具有 4 個獨立的高階功能——加密、解密、簽名、驗證——因為它們中的任何一個(如果適當地填充以避免選擇密文攻擊)都不能替代任何其他功能。[3][4][5][6][7][8][9][10][11][12]
- ↑ Android 開發人員。 "Signing Your Applications".
- ↑ Genuitec。 "iOS Application Provisioning Requirements".
- ↑ Nate Lawson。 "RSA public keys are not private".
- ↑ "RSA encryption with private key and decryption with a public key".
- ↑ "ElGamal encryption with private key".
- ↑ "Is encrypting data with a private key dangerous?".
- ↑ "Encryption with private key?".
- ↑ "Can one encrypt with a private key/decrypt with a public key?".
- ↑ "Encrypt with private key and decrypt with public key".
- ↑ "Encrypt using private key"
- ↑ "encrypt with private key decrypt with public key"
- ↑ "What is the difference between encrypting and signing in asymmetric encryption?".