非对称加密与RSA
一切的一切还得从 非对称加密 说起。在信息安全领域,加密方式分为对称加密与非对称加密。对称加密中,加密秘钥和解密秘钥完全相同,安全性不高。而非对称加密的加密秘钥和解密秘钥不同,具有更高的安全性,应用更加广泛.
在非对称加密中,加密秘钥称为 公钥 (Public Key),而解密秘钥称为 私钥 (Private),而且他们总是成双成对的。一般情况下,我们通过一些工具生成一对公钥和私钥后,将公钥发布给其他人,这样其他人就可以将消息使用公钥加密后发给给我,我接受到消息后,使用我的私钥将消息解密。
非对称加密有很多种 ,使用最广泛的是 RSA算法。
我们现在常用的RSA的秘钥的长度是1024位,不过据称这个长度的RSA已经有被破解的危险,因此提倡使用2048位长度的RSA。
SSH与RSA
我们在使用 SSH 连接到服务器时也会用到RSA。当然,SSH协议本身设计得具有很强大的扩展性,支持很多种加密算法,RSA只是其中的一种,不过也是应用最广泛的一种。
ssh可以生成公钥和密钥id_rsa.pub id_rsa,公钥在建立连接时传给服务器,后者是私钥,客户端(本机)使用此秘钥对服务器发送的数据进行解密,这个文件很重要,绝对不能外泄,因此最好是能对此文件进行加密,上面命令执行时中间有一个步骤会请你输入密码,这个密码就用于 加密私钥 。
SSH除了使用用户名密码进行身份验证外,也可以使用公钥进行身份验证。客户端连接服务器时,将客户端的公钥传送给服务器,服务器收到请求后,首先在服务器用户根目录 ~/.ssh/authorized_keys 寻找相应的公钥,如果两个秘钥一致,则验证通过。服务器会使用该公钥将数据加密进行传送。
而当客户端连接到服务器时,服务器也会将其公钥传送给客户端,可以在 ~/.ssh/known_hosts 文件中找到,从而实现双向数据加密。
https加密
大机构CA 私钥 已经装进系统了,所以 每个系统都可以分清是不是CA,这样保证CA时真的。
公司花钱请CA出证书,证书中带有CA的证书,系统可以确认CA证书的真伪,这样就保证了我公司证书的真伪。
完整过程:
step1: “客户”向服务端发送一个通信请求
“客户”->“服务器”:你好
step2: “服务器”向客户发送自己的数字证书。证书中有一个公钥用来加密信息,私钥由“服务器”持有
“服务器”->“客户”:你好,我是服务器,这里是我的数字证书
step3: “客户”收到“服务器”的证书后,它会去验证这个数字证书到底是不是“服务器”的,数字证书有没有什么问题,数字证书如果检查没有问题,就说明数字证书中的公钥确实是“服务器”的。检查数字证书后,“客户”会发送一个随机的字符串给“服务器”用私钥去加密,服务器把加密的结果返回给“客户”,“客户”用公钥解密这个返回结果,如果解密结果与之前生成的随机字符串一致,那说明对方确实是私钥的持有者,或者说对方确实是“服务器”。
“客户”->“服务器”:向我证明你就是服务器,这是一个随机字符串 //前面的例子中为了方便解释,用的是“你好”等内容,实际情况下一般是随机生成的一个字符串。
“服务器”->“客户”:{一个随机字符串}[私钥|RSA]
step4: 验证“服务器”的身份后,“客户”生成一个对称加密算法和密钥,用于后面的通信的加密和解密。这个对称加密算法和密钥,“客户”会用公钥加密后发送给“服务器”,别人截获了也没用,因为只有“服务器”手中有可以解密的私钥。这样,后面“服务器”和“客户”就都可以用对称加密算法来加密和解密通信内容了。
“客户”->“服务器”:{我们后面的通信过程,用对称加密来进行,这里是对称加密算法和密钥}[公钥|RSA]
“服务器”->“客户”:{OK,已经收到你发来的对称加密算法和密钥!有什么可以帮到你的?}[密钥|对称加密算法]
“客户”->“服务器”:{我的帐号是aaa,密码是123,把我的余额的信息发给我看看}[密钥|对称加密算法]
“服务器”->“客户”:{你好,你的余额是100元}[密钥|对称加密算法]
更详细的可以参考:
https://www.cnblogs.com/franson-2016/p/5530671.html
总结:
加密
• 共享/对称密钥加密:客户端和服务端使用相同的密钥加密,缺陷:发送密钥有被窃听的风险,但不发送,对方就不能解密。如果密钥能够安全发送,那么数据也能安全送达,就无需加密。
• 公开密钥加密:非对称加密,一把私钥,一把公钥,成对。首先,发送公钥给加密方,发送密文一方使用对方的公钥进行加密,对方收到密文后,使用自己的私钥进行解密。
• 混合加密:使用公开密钥加密方式传递共享密钥,再使用共享密钥加密传递的数据
证书的正确性:CA(数字认证机构)颁发的公开密钥证书
• 服务器把自己的公钥登录至CA进行认证;
• CA机构使用自己的私钥给服务器的公钥署数字签名并颁发公钥证书;
• 客户端拿到服务器的公钥证书后,使用数字证书认证机构的公开密钥(事先植入到浏览器客户端),向数字证书认证机构验证公钥证书上的数字签名,以确认服务器的公开密钥的真实性;
• 使用服务器的公开密钥对报文加密并发送
服务器使用自己的私有密钥进行解密
SSL/TLS握手协议:
• 客户端给出协议版本号,一个随机数(client random),以及客户端支持的加密方式;
• 服务端确认双方使用的加密方式,并给出数字证书,以及一个服务器生成的随机数(server random);
• 客户端确认证书有效,然后生成一个新的随机数(premaster secret),并使用数字证书的公钥加密这个随机数,发送给服务端;
• 服务端使用自己的私钥,获得客户端发送的随机数(premaster secret);
• 客户端和服务端,根据约定的加密方式,使用前面的三个随机数,生成一个对话密钥(session key),及共享密钥,然后使用该密钥加密整个数据交互过程。