本篇原文转载:数字签名算法介绍和区别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。