本篇原文轉載:數字簽名算法介紹和區別html
數字簽名是一個帶有密鑰的消息摘要算法,這個密鑰包括了公鑰和私鑰,用於驗證數據完整性、認證數據來源和抗否定,遵循OSI參考模型、私鑰簽名和公鑰驗證。也是非對稱加密算法和消息摘要算法的結合體,常見的數字簽名算法主要有RSA、DSA、ECDSA三種,本文對數字簽名算法進行詳細介紹。git
Hash又譯散列、摘要等名,本文統一稱Hash。算法
RSA是目前計算機密碼學中最經典算法,也是目前爲止使用最普遍的數字簽名算法,RSA數字簽名算法的密鑰實現與RSA的加密算法是同樣的,算法的名稱都叫RSA。密鑰的產生和轉換都是同樣的,包括在售的全部SSL數字證書、代碼簽名證書、文檔簽名以及郵件簽名大多都採用RSA算法進行加密。segmentfault
RSA數字簽名算法主要包括MD和SHA兩種算法,例如咱們熟知的MD5和SHA-256便是這兩種算法中的一類,具體以下表格分佈瀏覽器
最多見的是咱們熟知的MD5加密算法,MD5全稱Message-Digest Algorithm 5(信息-摘要算法 5),目前比較廣泛的Hash算法,是散列算法的基礎原理,MD5的前身有MD二、MD3和MD4。MD5算法法是輸入任意長度字符,輸出固定長度128位的算法。通過程序流程,生成四個32位數據,最後聯合起來成爲一個128位Hash值,主要方式是經過求餘、取餘、調整長度、與連接變量進行循環運算進而得出結果。安全
SHA-1是由NIST NSA設計爲同DSA一塊兒使用的,SHA-1設計時基於和MD4相同原理,而且模仿了該算法,SHA-1抗窮舉(brute-force)性更好,它產出160位的Hash值,對於非線性運算、移位和加法運算也與MD5相似。SHA-1也應用於包括TLS和SSL、PGP、SSH、S/MIME和IPsec等多種協議中,曾被視爲是MD5的後繼者。SHA-1的現在已經明確不具有安全性可言了。post
在2016年1月1往後基於SHA-1簽發的SSL和代碼簽名的X.509證書已不具有安全性可言,多個操做系統、瀏覽器都建議將基於SHA-1而簽發的證書、代碼簽名替換至SHA-2的產品,但目前在Windows XP(官方已停更)操做系統上仍然只兼容基於SHA-1算法的SSL和代碼簽名產品。性能
就在2017年2月23日Google宣佈實現了對SHA-1算法的碰撞破解,因此SHA-1算法已經正式被宣佈爲不安全的算法,主流廠商對自身產品及安全要求都提高至了SHA-2算法。ui
SHA-22四、SHA-25六、SHA-384和SHA-512並稱爲SHA-2,發佈於2001年,目前比較普遍應用的SSL數字證書和代碼簽名證書籤名算法均採用SHA-256算法,相較於SHA-1算法而言,至今SHA-2算法還未被破解,從某種意義上SHA-2延用了SHA-1算法,因此至少發文時間起是安全的。目前頂級CA和Google、蘋果等公司都採用基於SHA-256算法做爲SSL證書和代碼簽名證書的主流簽名算法。編碼
SHA-3算法正式發佈於2015年,SHA-3並非要取代SHA-2,由於SHA-2目前並無出現明顯的弱點。因爲對MD五、SHA-0和SHA-1出現成功的破解,NIST感受須要一個與以前算法不一樣的,可替換的加密Hash算法,也就是如今的 SHA-3。
SHA-3選用keccak算法爲標準,以太坊即是採用keccak算法。
DSA全稱Digital Signature Algorithm,DSA只是一種算法,和RSA不一樣之處在於它不能用做加密和解密,也不能進行密鑰交換,只用於簽名,因此它比RSA要快不少,其安全性與RSA相比差很少。DSA的一個重要特色是兩個素數公開,這樣,當使用別人的p和q時,即便不知道私鑰,你也能確認它們是不是隨機產生的,仍是做了手腳。RSA算法卻作不到。
DSA的整個簽名算法流程以下:
ECDSA是用於數字簽名,是ECC與DSA的結合,整個簽名過程與DSA相似,所不同的是簽名中採起的算法爲ECC,最後簽名出來的值也是分爲r,s。而ECC(全稱Elliptic Curves Cryptography)是一種橢圓曲線密碼編碼學。
ECDH每次用一個固定的DH key,致使不能向前保密(forward secrecy),因此通常都是用ECDHE(ephemeral)或其餘版本的ECDH算法。ECDH則是基於ECC的DH( Diffie-Hellman)密鑰交換算法。
ECC與RSA 相比,有如下的優勢:
下表是ECC和RSA安全性比較
攻破時間(MIPS年)RSA/DSA(密鑰長度)ECC密鑰長度RSA/ECC密鑰長度比1045121065:11087681326:1101110241607:11020204821010:110782100060035:1
下表是RSA和ECC速度比較
功能Security Builder 1.2BSAFE 3.0163位ECC(ms)1,023位RSA(ms)密鑰對生成3.84,708.3簽名2.1(ECNRA)228.43.0(ECDSA)認證9.9(ECNRA)12.710.7(ECDSA)Diffie—Hellman密鑰交換7.31,654.0
在 ECDHE 密鑰交換中,服務端使用證書私鑰對相關信息進行簽名,若是瀏覽器能用證書公鑰驗證簽名,就說明服務端確實擁有對應私鑰,從而完成了服務端認證。密鑰交換和服務端認證是徹底分開的。
可用於 ECDHE 數字簽名的算法主要有 RSA 和 ECDSA,也就是目前密鑰交換 + 簽名有三種主流選擇:
對於SSL數字證書和代碼簽名證書以及其它非對稱加密產品來講,RSA目前普及度最高,以SHA-256簽名算法最廣,對於更高級基於ECC簽名算法是須要對證書請求文件CSR和根證書都有相應的要求。
自2016年1月1日起大多CA已中止簽發不安全的SHA-1簽名算法,全部CA目前簽發的證書都要求基於SHA-2簽名算法。
與SHA-2選項相似,FULL SHA-2選項將爲您提供相同的SHA-2證書和中間證書,但根證書再也不是基於SHA-1而是SHA-2。
和「FULL-SHA-2」選項相似,你將須要提供一個基於ECC算法的CSR,同時ECC-HYBRID ECC-HYBRID與ECC-FULL同樣,ECC的幾種算法都要求根證書是RSA。