1. 程式人生 > >數字簽名驗證及加解密中的一些概念

數字簽名驗證及加解密中的一些概念

對稱加密

通訊雙方使用同一個金鑰( secret )加密解密

金鑰(Secret)

對稱加密中雙方共同使用的密碼

非對稱加密

通訊中的金鑰是成對的:公鑰A和私鑰B。用A加密的密文只能用B解密,同樣,用B加密的密文也只能用A解密

在非對稱加密演算法中,如果一個“金鑰對”中的兩個金鑰滿足以下兩個條件:
1、對資訊用其中一個金鑰加密後,只有用另一個金鑰才能解開;
2、其中一個金鑰公開後,根據公開的金鑰別人也無法算出另一個。
那麼我們就稱這個金鑰對為非對稱金鑰對,公開的金鑰稱為公鑰,不公開的金鑰稱為私鑰。

常見的非對稱加密演算法包括RSA、Elgamal、D-H、ECC(橢圓曲線加密演算法)等。

公鑰(Public Key) & 私鑰(Private Key)

公鑰與私鑰一一對應。

公鑰自由釋出給外部通訊方。

私鑰需要自己祕密儲存,一旦洩漏則可能導致身份被偽造,機密資訊洩漏。

加密 & 解密

發方用收方的公鑰加密,收方用自己的私鑰解密,防止資訊被第三方獲取。

當發方向收方通訊時發方用收方的公鑰對原文進行加密,收方收到發方的密文後,用自己的私鑰進行解密,其中他人是無法解密的,因為他人不擁有自己的私鑰,這就是用公鑰加密,私鑰解密用於通訊;

簽名 & 驗證

發方用自己的私鑰簽名,收方用發方公鑰驗證,用來驗證發方的身份,防止資訊被第三方偽造。

發出的簽名一般並非是對原文字身進行加密,而是要對原文進行所謂的“雜湊”(Hash)運算,即對原文作數字摘要。該密碼演算法也稱單向雜湊運算,其運算結果稱為雜湊值,或稱數字摘要,也有人將其稱為“數字指紋”。雜湊值有固定的長度,運算是不可逆的,不同的明文其雜湊值是不同的,而同樣的明文其雜湊值是相同並且是唯一的,原文的任何改動,其雜湊值就要發生變化。

簽名驗證與加密解密的原理相同,簽名即是用私鑰對數字摘要進行加密,將原文和密文同時發給收方,收方用公鑰對密文進行解密,然後與原文的摘要進行比對驗證。

非對稱金鑰的基本使用場景有兩種:1、公鑰對交易資訊加密,私鑰對交易資訊解密。私鑰持有人解密後,可以使用收到的價值。2、私鑰對資訊簽名,公鑰驗證簽名。通過公鑰簽名驗證的資訊確認為私鑰持有人發出。

數字證書由證書中心(CA)頒發,包含客戶公鑰和其他資訊(如域名,公司名稱),需要用證書中心的公鑰進行解密。

CA是數字證書認證中心的簡稱,是指發放、管理、廢除數字證書的機構。CA的作用是檢查證書持有者身份的合法性,並用自己的私鑰對客戶的公鑰和客戶資訊進行加密,生成數字證書,防止證書被偽造或篡改,以及對證書和金鑰進行管理。

證書鏈

TODO

KeyStore & Keytool

KeyStore 是用來儲存金鑰和證書的金鑰倉庫,其中包含兩類條目( Entry ):金鑰項、證書項。KeyStore 一般是一個檔案,用密碼保護。

Keytool 是Java 中(位於 JDK\Bin 目錄下)管理金鑰和證書的工具,可以用來生成金鑰、建立數字證書,所有的金鑰和數字證書是以一條一條(採用別名區別)的形式存入 KeyStore 中,一條證書包含私鑰,公鑰和對應的證書主體資訊三種資訊。

Keytool 可以將 KeyStore中的證書匯出為數字證書檔案,數字證書檔案只包括主體資訊和對應的公鑰。JDK 的 Keytool 不能匯出私鑰,但是用一些三方的證書工具可以匯出,如 jksExportKey,KeyStore Explorer等 。

KeyStore的幾種實現型別

JKS:

Java Key Store,提供者是 SUN,Java特有,也是Java程式設計中最常見的型別。其中的條目可以是私鑰和證書,但不支援對稱加密中的secret。其中儲存的私鑰不能在 Java 中取出。

JCEKS

JCE Key Store (Java Cryptography Extension KeyStore),提供者是 SunJCE。從 Java 1.4 的版本開始有,是 JKS 的超集,支援更多的演算法,條目可以是私鑰、證書和對稱加密的secret。用更強的三重資料加密演算法(Triple DES encryption)保護其中的私鑰。

PKCS12

PKCS(The Public-Key Cryptography Standards,公鑰加密標準)中定義的個人資訊交換語法,非Java特有,在Java和其它語言中都可以使用,可以儲存私鑰、證書和secret。不同於JKS的是,其中的私鑰內容可以在 Java 中取出。這種型別更便於不同程式語言之間的適配。目前 Java 中預設型別是 JKS,但從 Java 9開始,預設型別將改為 PKCS12

BKS:

Bouncy Castle Keystore(提供者是 Bouncy Castle),目前主要是 Android 在使用這種型別。

參考