今天被问到关于https原理的问题,结果因为知识掌握不牢靠,停留于表面,不少细节都没法回答清楚,因而决定把https的原理弄个明白,废话很少说,咱们先看看https的定义git
(因为好久未写博客,排版有些凌乱,请谅解)算法
在说HTTPS以前先说说什么是HTTP,HTTP就是咱们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,所以使 用HTTP协议传输隐私信息很是不安全。为了保证这些隐私数据能加密传输,因而网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,以后IETF对SSL 3.0进行了升级,因而出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。实际上咱们如今的HTTPS都是用的TLS协议,可是因为SSL出现的时间比较早,而且依旧被如今浏览器所支持,所以SSL依然是HTTPS的 代名词,但不管是TLS仍是SSL都是上个世纪的事情,SSL最后一个版本是3.0,从此TLS将会继承SSL优良血统继续为咱们进行加密服务。目前 TLS的版本是1.2,定义在RFC 5246中,暂时尚未被普遍的使用。对历史感兴趣的朋友能够参考http://en.wikipedia.org/wiki/Transport_Layer_Security,这里有对TLS/SSL详尽的叙述。编程
HTTPS在传输数据以前须要客户端(浏览器)与服务端(网站)之间进行一次握手,在握 手过程当中将确立双方加密传输数据的密码信息,一般状况下会配合数字证书实现。浏览器
TLS/SSL协议不只仅是一套加密传输的协议,更是一件通过艺术家精心设计的艺术品,TLS/SSL中使用 非对称加密,对称加密以及HASH算法。安全
这里咱们先看看这上面提到的几种技术(若是你对这些技术已经很是了解,那么请跳过该段落,直接到段落三)网络
数字证书分布式
数字证书是一种权威性的电子文档,由权威公正的第三方机构,即CA中心签发的证书。它以数字证书为核心的加密技术能够对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性。 使用了数字证书,即便您发送的信息在网上被他人截获,甚至您丢失了我的的帐户、密码等信息,仍能够保证您的帐户、资金安全。
它能提供在Internet上进行身份验证的一种权威性电子文档,人们能够在互联网交往中用它来证实本身的身份和识别对方的身份。固然在数字证书认证的过程当中证书认证中心(CA)做为权威的、公正的、可信赖的第三方,其做用是相当重要的.如何判断数字认证中心公正第三方的地位是权威可信的。VeriSign、GeoTrust、Thawte 是国际权威数字证书颁发认证机构的“三巨头”,其中,应用最广的为VerSign签发的电子商务数字证书。
CER(Canonical Encoding Rules,规范编码格式) 是数字证书的一种编码格式,它是BER(Basic Encoding Rules 基本编码格式) 的一个变种,比BER 规定得更严格。后缀的证书文件有两种编码:
DER(Distinguished Encoding Rule 卓越编码格式) 一样是BER的一个变种,DER使用定长模式。
PKCS(Public-Key Cryptography Standards,公钥加密标准) 由RSA实验室和其余安全系统开发商为公钥密码的发展而制定的一系列标准。
pfx是指以pkcs#12格式存储的证书和相应私钥。
在Security编程中,有几种典型的密码交换信息文件格式:
DER-encoded certificate: .cer, .crt
PEM-encoded message: .pem
PKCS#12 Personal Information Exchange: .pfx, .p12
PKCS#10 Certification Request: .p10 .csr
PKCS#7 cert request response: .p7r
PKCS#7 binary message: .p7b .p7c .spc
cer/.crt 是用于存放证书,它是2进制形式存放
pem 跟crt/cer的区别是它以Ascii来表示
pfx/p12 用于存放我的证书/私钥,他一般包含保护密码,2进制方式
p10 .csr 是证书请求
p7r是CA对证书请求的回复,只用于导入
p7b .p7c .spc 以树状展现证书链(certificate chain),同时也支持单个证书,不含私钥
函数
非对称加密算法网站
1976年,美国学者Dime和Henman为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议,容许在不安全的媒体上的通信双方交换信息,安全地达成一致的密钥,这就是"公开密钥系统"。相对于"对称加密算法"这种方法也叫作"非对称加密算法"。与对称加密算法不一样,非对称加密算法须要两个密钥:公开密钥(publickey)和私有密(privatekey)。公开密钥与私有密钥是一对,若是用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;若是用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。由于加密和解密使用的是两个不一样的密钥,因此这种算法叫做非对称加密算法。ui
非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把做为公用密钥向其它方公开;获得该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用本身保存的另外一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。非对称加密算法的保密性比较好,它消除了最终用户交换密钥的须要,但加密和解密花费时间长、速度慢,它不适合于对文件加密而只适用于对少许数据进行加密。 经典的非对称加密算法如RSA算法等安全性都至关高. 非对称加密的典型应用是数字签名。采用双钥密码系统的加密方法,在一个过程当中使用两个密钥,一个用于加密,另外一个用于解密,这种加密方法称为非对称加密,也称为公钥加密,由于其中一个密钥是公开的(另外一个则须要保密)。
DH (Diffie-Hellman)
Diffie-Hellman算法(D-H算法),密钥一致协议。是由公开密钥密码体制的奠定人Diffie和Hellman所提出的一种思想。简单的说就是容许两名用户在公开媒体上交换信息以生成"一致"的、能够共享的密钥。换句话说,就是由甲方产出一对密钥(公钥、私钥),乙方依照甲方公钥产生乙方密钥对(公钥、私钥)。以此为基线,做为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥(SecretKey)对数据加密。这样,在互通了本地密钥(SecretKey)算法后,甲乙双方公开本身的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可使用对方的公钥和本身的私钥对数据解密。不仅仅是甲乙双方两方,能够扩展为多方共享数据通信,这样就完成了网络交互数据的安全通信!该算法源于中国的同余定理——中国馀数定理。RSA
RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它可以抵抗到目前为止已知的全部密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,所以能够将乘积公开做为加密密钥。EL Gamal
EL Gamal算法是公钥密码体制中的一种 ,在密码学中占有重要的地位。但该算法所采用的幂剩余计算耗时太多的问题 ,一直是制约其普遍应用的瓶颈问题。提出一种经过建表 ,以及对传统二进制算法进行改进 ,即将指数进行 2 k进制化 ,减小原 BR算法迭代次数 ,提升加密解密速度的算法。ECC
ECC (Elliptical Curve Cryptography,椭圆曲线加密)算法不椭圆曲线理论为基础,在建立密钥时能够更快,更小,而且更有效,它是用大质数的积来产生。目前Java 6公提供了DH和RSA两种算法实现,经过Bouncy Castle能够实现Elmal算法支持,另ECC加密算法,目前没有开源组件提支持
对称加密算法
对加密和解密使用相同密钥的加密算法。因为其速度,对称性加密一般在消息发送方须要加密大量数据时使用。对称性加密也称为密钥加密。对称式数据加密的方式的工做原理如图。所谓对称,就是采用这种加密方法的双方使用方式用一样的密钥进行加密和解密。密钥其实是一种算法,通讯发送方使用这种算法加密数据,接收方再以一样的算法解密数据。所以对称式加密自己不是安全的。经常使用的对称加密有:
DES、IDEA、RC二、RC四、SKIPJACK算法等 。
采用单钥密码系统的加密方法,同一个密钥能够同时用做信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
HASH算法
经常使用的摘要算法包括MD5,SHA1,SHA256
消息摘要算法的特色:
① 不管输入的消息有多长,计算出来的消息摘要的长度老是固定的。
② 消息摘要看起来是“随机的”。这些比特看上去是胡乱的杂凑在一块儿的。
③ 通常地,只要输入的消息不一样,对其进行摘要之后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。
④ 消息摘要函数是无陷门的单向函数,即只能进行正向的信息摘要,而没法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息。
⑤ 好的摘要算法,没法找到两条消息,是它们的摘要相同。
消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个惟一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行做用而产生。若是消息在途中改变了,则接收者经过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。所以消息摘要保证了消息的完整性。消息摘要采用单向Hash 函数将需加密 的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不一样的明文摘要成密文,其结果老是不一样的,而一样的明文其摘要一定一致 。这样这串摘要即可成为验证实文是不是"真身"的"指纹"了。
HASH函数的抗冲突性使得若是一段明文稍有变化,哪怕只更改该段落的一个字母,经过哈希算法做用后都将产生不一样的值。而HASH算法的单向性使得要找到到哈希值相同的两个不 同的输入消息,在计算上是不可能的。因此数据的哈希值,即消息摘要,能够检验数据的完整性。哈希函数的这种对不一样的输入可以生成不一样的值的特性使得没法找到两个具备相同哈希值的输入。所以,若是两个文档经哈希转换后成为相同的值,就能够确定它们是同一文档。 因此,当但愿有效地比较两个数据块时,就能够比较它们的哈希值。例如,能够经过比较邮件发送前和发送后的哈希值来验证该邮件在传递时是否修改消息摘要算法的主要特征是加密过程不须要密钥,而且通过加密的数据没法被解密,只有输入相同的明文数据通过相同的消息摘要算法才能获得相同的密文。消息摘要算法不存在 密钥的管理与分发问题,适合于分布式网络相同上使用。因为其加密计算的工做量至关可观,因此之前的这种算法一般只用于数据量有限的状况下的加密,例如计算机的口令就是 用不可逆加密算法加密的。