做者:shede333
主页:http://my.oschina.net/shede333 && http://blog.sina.com.cn/u/1509658847
版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | [Creative Commons BY-NC-ND 3.0][]html
###DES: Digital Encryption Standard. Obsolete standard. 单密钥算法,是信息的发送方采用密钥A进行数据加密,信息的接收方采用同一个密钥A进行数据解密.git
单密钥算法是一个对称算法. 算法好在加/解速度快,密钥量短,采用对称加密算法
###DSA: Digital Signature Algorithm. based on discrete logarithms computation. 主要用于签名
在DSA数字签名和认证中,发送者使用本身的私钥对文件或消息进行签名,接受者收到消息后使用发送者的公钥
DSA只是一种算法,和RSA不一样之处在于它不能用做加密和解密,也不能进行密钥交换,
只用于签名,它比RSA要快不少.shell
DSA只能与SHA-1一块儿使用,而RSA能够与任何摘要算法一块儿使用。DSA签名不包括摘要标识符,因此若是容许多种摘要算法就会使DSA遭受前面RSA里面介绍的那种替换攻击。DSA主要依赖于整数有限域离散对数难题。windows
与RSA不一样的是,RSA是对签名数据“解密”后再比对摘要值,而DSA中摘要值是须要参与计算的。浏览器
###RSA: RSA 是一种非对称加解密算法。
RSA 与 DSA 都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解(两个素数的乘积);DSA 的安全性安全
是基于整数有限域离散对数难题。基本上能够认为相同密钥长度的 RSA 算法与 DSA 算法安全性至关。服务器
公钥用于加密,它是向全部人公开的;私钥用于解密,只有密文的接收者持有。网络
DSA 用于签名,而 RSA 可用于签名和加密。session
**refer: **
###公钥、私钥 的解释
公钥
:用于向外发布,任何人都能获取,
私钥
:要本身保存,切勿给别人
一下两种状况常常有人弄混,必定要理解。
状况1:公钥用于【加密】, 私钥用于【解密】
若是加密密钥是公开的,这用于客户给私钥全部者上传加密的数据,这被称做为公开密钥加密(狭义)。
例如,网络银行的客户发给银行网站的帐户操做的加密数据。HTTPS 等。
状况2:公钥用于【解密】,私钥用于【加密】
若是解密密钥是公开的,用私钥加密的信息,能够用公钥对其解密,用于客户验证持有私钥一方发布的数据或文件是完整准确的,接收者由此可知这条信息确实来自于拥有私钥的某人,这被称做数字签名,公钥的形式就是数字证书。例如,从网上下载的安装程序,通常都带有程序制做者的数字签名,能够证实该程序的确是该做者(公司)发布的而不是第三方伪造的且未被篡改过(身份认证/验证)。
refer:
###签名:
加密后的hash值
这里主要解释一下签名,签名就是在信息的后面再加上一段内容,能够证实信息没有被修改过,怎么样能够达到这个效果呢?通常是对信息作一个hash计算获得一个hash值,注意,这个过程是不可逆的,也就是说没法经过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后作为一个签名和信息一块儿发出去
###指纹: 指纹算法 即 一个hash算法 ,例如md5算法;
注意,为了保证安全,在证书的发布机构发布证书时,证书的指纹和指纹算法,都会加密后再和证书放到一块儿发布,以防有人修改指纹后伪造相应的数字证书。这里问题又来了,证书的指纹和指纹算法用什么加密呢?他们是用证书发布机构的私钥进行加密的。能够用证书发布机构的公钥对指纹和指纹算法解密,也就是说证书发布机构除了给别人发布证书外,他本身自己也有本身的证书。证书发布机构的证书是哪里来的呢???这个证书发布机构的数字证书(通常由他本身生成)在咱们的操做系统刚安装好时(例如windows xp等操做系统),这些证书发布机构的数字证书就已经被微软(或者其它操做系统的开发机构)安装在操做系统中了,微软等公司会根据一些权威安全机构的评估选取一些信誉很好而且经过必定的安全认证的证书发布机构,把这些证书发布机构的证书默认就安装在操做系统里面了,而且设置为操做系统信任的数字证书。这些证书发布机构本身持有与他本身的数字证书对应的私钥,他会用这个私钥加密全部他发布的证书的指纹做为数字签名。
refer: 数字签名是什么?
###公钥登录 error
使用密码登陆,每次都必须输入密码,很是麻烦。好在SSH还提供了公钥登陆,能够省去输入密码的步骤。 所谓"公钥登陆",原理很简单,就是用户将本身的公钥储存在远程主机上。登陆的时候,远程主机会向用户发送一段随机字符串,用户用本身的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,若是成功,就证实用户是可信的,直接容许登陆shell,再也不要求密码。 这种方法要求用户必须提供本身的公钥。若是没有现成的,能够直接用ssh-keygen生成一个:
$ ssh-keygen
refer:
localhost:客户端,
remotehost:服务器
密钥访问:localhost经过ssh-keygen来生成公钥密钥对,若是他想访问一个remotehost,则只须要将公钥添加到 remotehost的~/.ssh/authorized_keys中,接下来,当localhost经过ssh登陆 username@remotehost时,remotehost会生成一个随机数,经过autrorized_keys中的公钥们生成一系列数值发给 localhost,localhost会经过本身的私有密钥解密发过来的一系列数值(固然,只有用对应的公钥生成的数值才会被正常解密),随 后,localhost将解密后的数值发回去,remotehost若发现发回来的数值是原先产生的随机数时,便会容许该localhost访问。固然, 若是localhost生成的rsa密钥是须要密码的话,接下来还要输入该密码。
refer:
###SSH基本原理和免密码登陆
从客户端来看,SSH提供两种级别的安全验证:
第一种级别是基于口令的安全验证:
(1)远程主机收到用户的登陆请求,把本身的公钥发给用户。
(2)用户使用这个公钥,将登陆密码加密后,发送回来。
(3)远程主机用本身的私钥,解密登陆密码,若是密码正确,就赞成用户登陆。
缺点:若是有人冒充服务器,就会给你假服务器公钥,最后就能得到你回应的密码,这就是中间人攻击。
第二种级别是基于密匙的安全验证:
前提:客户端建立一对公钥+秘钥,同时将公钥放在服务器上。
1.客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证; 2. 服务器收到请求以后,先在该服务器上寻找你的公钥,而后把它和你发送过来的公用密匙进行比较。若是两个密匙一致,服务器就用这个公钥加密一个【随机字符串】并把它发送给客户端软件; 3.客户端软件收到【加密后的-随机字符串】以后,就能够用你的私人密匙解密,再把【随机字符串】发送给服务器
与第一种级别相比,第二种级别不须要在网络上传送口令。第二种级别不只加密全部传送的数据,并且“中间人”这种攻击方式也是不可能的(由于他没有你的私人密匙)。可是整个登陆的过程可能须要10秒,可是相比输入密码的方式来讲10秒也不长。
refer:
###公钥认证的原理
所谓的公钥认证,其实是使用一对加密字符串,一个称为公钥(public key),任何人均可以看到其内容,用于加密;另外一个称为密钥(private key),只有拥有者才能看到,用于解密。经过公钥加密过的密文使用密钥能够轻松解密,但根据公钥来猜想密钥却十分困难。
ssh 的公钥认证就是使用了这一特性。服务器和客户端都各自拥有本身的公钥和密钥。为了说明方便,如下将使用这些符号。
Ac 客户端公钥
Bc 客户端密钥
As 服务器公钥
Bs 服务器密钥
在认证以前,客户端须要经过某种方法将公钥 Ac 登陆到服务器上。
认证过程分为两个步骤。
会话密钥(session key)生成
客户端请求链接服务器,服务器将 As 发送给客户端。
服务器生成会话ID(session id),设为 p,发送给客户端。
客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
客户端将 r 用 As 进行加密,结果发送给服务器。
服务器用 Bs 进行解密,得到 r。
服务器进行 r xor p 的运算,得到 q。
至此服务器和客户端都知道了会话密钥q,之后的传输都将被 q 加密。
认证
服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
客户端使用 Bc 解密 S(x) 获得 x
客户端计算 q + x 的 md5 值 n(q+x),q为上一步获得的会话密钥
服务器计算 q + x 的 md5 值 m(q+x)
客户端将 n(q+x) 发送给服务器
服务器比较 m(q+x) 和 n(q+x),二者相同则认证成功
refer:
###非对称加密
服务器创建公钥: 每一次启动 sshd 服务时,该服务会主动去找 /etc/ssh/ssh_host* 的文件,若系统刚刚安装完成时,因为没有这些公钥,所以 sshd 会主动去计算出这些须要的公钥,同时也会计算出服务器本身须要的私钥
*
客户端主动联机请求: 若客户端想要联机到 ssh 服务器,则须要使用适当的客户端程序来联机,包括 ssh, putty 等客户端程序链接
*
服务器传送公钥给客户端: 接收到客户端的要求后,服务器便将第一个步骤取得的公钥传送给客户端使用 (此时应是明码传送,反正公钥原本就是给你们使用的)
*
客户端记录并比对服务器的公钥数据及随机计算本身的公私钥: 若客户端第一次链接到此服务器,则会将服务器的公钥记录到客户端的用户家目录内的 ~/.ssh/known_hosts 。如果已经记录过该服务器的公钥,则客户端会去比对这次接收到的与以前的记录是否有差别。若接受此公钥, 则开始计算客户端本身的公私钥
*
回传客户端的公钥到服务器端: 用户将本身的公钥传送给服务器。此时服务器:具备服务器的私钥与客户端的公钥,而客户端则是: 具备服务器的公钥以及客户端本身的私钥,你会看到,在这次联机的服务器与客户端的密钥系统 (公钥+私钥) 并不同,因此才称为非对称加密系统
*
开始双向加解密: (1)服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用本身的私钥解密 (2)客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密,这样就能保证通讯安全
refer:
SSH 协议与OpenSSH详解 - Share your knowledge … - 51CTO技术博客
###SSL/TLS协议
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,而后用公钥加密信息,服务器收到密文后,用本身的私钥解密。
SSL/TLS协议(HTTPS 也是这样的)的基本过程是这样的:
1.客户端生成【随机数1】,客户端(一般是浏览器)先向服务器发出加密通讯的请求,发送【随机数1】,向服务器端索要公钥; 2.服务器收到客户端请求后,生成【随机数2】,向客户端发出回应,回应信息包括【随机数2】,服务器证书(包含公钥) 3.客户端收到后,验证服务器证书的有效性,取出公钥,生成【随机数3】,使用公钥加密【随机数3】,发给服务器。 4.服务器回应, 至此,服务器和客户端都有3个随机数,使用3个随机数生成此次的会话秘钥(即对称秘钥),两者开始使用对称加密通信。服务器通知客户端:编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的全部内容的hash值,用来供客户端校验(对称加密)。 5.以后两者将经过对称加密来通信。
解释:为啥使用3个随机数。
不论是客户端仍是服务器,都须要随机数,这样生成的密钥才不会每次都同样。因为SSL协议中证书是静态的,所以十分有必要引入一种随机因素来保证协商出来的密钥的随机性,三个随机数经过一个密钥导出器最终导出一个对称密钥,增长随机性
以前不少讲HTTPS原理的(包括下面的https),都只有1个随机数,为啥?由于毕竟是讲原理,并无讲清细节;
简单来讲,一开始使用的非对称加密,就是为了安全的传递对称秘钥,毕竟对称加密的速度快。
refer:
###https 非对称+对称
refer: