https ssl(tls)为何不直接用公钥加密数据?

不少人都提到了非对称加密速度慢,但这只是一个缘由,但不是主要缘由,甚至是微不足道的缘由。html

SSL协议到3.0后就已经到头了,取而代之的是TLS,相较于SSL的“安全套接字层”的命名,TLS的“传输层安全”这种定义更加严谨。毕竟传输安全的范畴要远大于套接字安全这种定义,这种定义偏技术层面,但安全不只要解决技术层面的问题,也要解决人的问题以及由此带来的信任问题。由于加密只是安全的一部分,解决传输两端的信任,以及让整个算法摆脱人的因素,才是安全的核心。算法

诈骗电话之因此能让不少人上当,其实是一种信任欺诈,即便你和骗子间的通讯采用了量子加密,安全到连FBI、CIA、克格勃、摩萨德、朝阳大妈都没法破解的地步,这也只能确保你被骗的更加安全、更加保密而已。安全

腾讯即便能把你和潜在“炮友”的聊天加密到连你老婆都没法破解的地步,但仍是没法确保你的聊天对象究竟是男的仍是女的,是个美女仍是丑B,即便是无所不能的“剽窃惯犯”小马哥也作不到,作不到就是作不到,大马哥也作不到。服务器

如下两个问题:网站

一、如何确保私钥的安全,若是一个公司的后台人员离职并把私钥带走,该怎么办?加密

私钥不管是配置到Tomcat仍是Ngnix都须要后台人员的参与,甚至整个后台开发人员都知道私钥文件在哪,把私钥文件带走是so easy的事,即使这个私钥采用了p12格式进行了加密,但这个密码仍是由后台开发人员掌握。固然,若是这个公司的全部事情都是老板亲自亲为,那就是另一回事。设计

显然任何公司都不可能由于一个后台人员的离职,并由此产生潜在的私钥泄密风险而去从新申请SSL证书。一是解决不了根本问题; 二是费用的问题,三是总不能频繁发布公钥让吃瓜群众不停的更新。htm

回到题主的问题,若是客户端(客户端只有公钥)用公钥加密,私钥解密的话,显然受人为的因素,风险太大了。即使这个公司的老板很开明(也但是很糊涂),相信全部人都是可靠的,采用了公钥加密私钥解密,但也只是解决了单向传输的问题。对象

若是服务器向客户端发送数据,则须要私钥加密,公钥解密。那么真能用私钥加密么?blog

二、不管是openssl仍是微软的CryptoAPI,都没有提供私钥的加密功能,而只是将私钥的加密功能限定在签名上,为何不提供私钥加密API呢?
显然不是由于openssl作不到,也不是由于微软作不到。让私钥不提供加密接口是出于安全的目的,也就是要保护私钥。若是私钥频繁用于数据加密,公钥在解密的过程当中颇有可能会破解私钥,从而致使私钥泄漏。若是把私钥加密只是应用到签名上,也就是身份认证,则会大大下降因为私钥加密频繁致使的泄密风险,毕竟签名一次就够了。

固然openssl是开源的,你能够改造一下提供私钥加密的接口。

在SSL(TLS)中,RSA只是用于身份认证,即解决信任问题,确保你访问的网站是淘宝,而不是高仿的“陶宝”,让你在淘宝上买的是康师傅,而不是康帅傅而已。

最后总结一下,稍微说下openssl。
实际上openssl是对传输安全策略的设计,是一种思想,这种思想就是让安全策略尽量的摆脱对人的信任依赖,在openssl中加密只是安全策略的一部分。基于这种思想来保障安全的数据传输,显然单靠RSA没法解决这个问题,openssl中采用的是组合方式,也就是加密套件,好比以下套件:TLS_RSA_WITH_AES_128_CBC_SHA。

TLS:表示协议;

RSA:表示数据加密秘钥的加密算法(比较拗口)和身份认证的算法;

AES_128_CBC:表示对称加密算法,这个是数据加密的真正算法;

SHA:表示mac校验的算法,也用于PRF产生的算法;

所以,数据加密的秘钥保护是核心,数据秘钥的产生要随机,要能即兴发挥的临时产生。
好比经过随机数产生PreMasterKey,算法能够复杂点,通讯双方各自贡献PreMasterKey的参数,最后客户端对PreMasterKey进行RSA加密后传输给服务器,服务器解密后,根据规则产生真正的加密Master Key,这个MasterKey就是对称加密的秘钥。

即使如此,因为RSA参与了数据秘钥的加密过程,所以也会致使因私钥泄漏产生的不安全(正如上面所说,私钥文件要依赖人的安全),也就是说最好连非对称加密的秘钥对也能临时产生并用户动态交换,ECDHE就产生了。好比套件:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

这里的RSA仅仅是做为身份认证(即证实网站是可信的,确实是淘宝网站),RSA将再也不对PreMaterKey进行加密,该值的产生有ECDHE算法负责,这样进一步减小了对人的依赖。由于一旦网站的数据被抓包留存,理论上就存在PreMasterKey被解密的可能,从而致使MasterKey的泄漏,以致于整个通讯数据都不安全。

说的太多了,超出问题的范畴,就此打住。。。。。

附:我本身封装过TLS客户端通讯,并用于本身的邮箱程序,见下文。

一只会铲史的猫:个人箱客户端程序Popmail,以及巴拉巴拉。。。

这是我封装的SSLite.dll,里面有如何使用该库进行HTTP网页的下载源码:

基于SSL(TLS)的HTTPS网页下载

相关文章
相关标签/搜索