互联网的加密原理
加密主要有两种方式:对称加密和非对称加密。
对称加密
对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时作为信息的加密和解密,这种方式也叫做单密钥加密。所谓的对称,就是采用这种加密方式的双方使用同样的密钥进行加密和解密。
密钥是控制加密和解密过程的指令,算法是一组规则,规定了如何进行加密解密。
加密的安全性不仅取决于加密算法本身,更在于密钥管理的安全性。
由于对称加密速度快,所以通常用在消息发送方需要加密大量数据时使用。但是因为加密和解密都使用同一个密钥,如何把密钥安全的传递到解密者手上就成了必须要解决的问题。
常用的对称加密有: DES, IDEA, RC2, RC4, SKIPJACK, RC5, AEC算法等。
非对称加密
非对称加密算法需要两个密钥:公钥和私钥
公钥和私钥是一对,如果用公钥加密,只能用对应的私钥才能解密;如果用私钥加密,那么只能用对应的公钥解密。由于加密和解密使用的是两个不同的密钥,所以叫这种加密算法叫做非对称加密算法。
工作原理:
1. A向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥;
2. A的私钥保密,把公钥给B;B的私钥保密,把公钥给A;
3. A发消息给B,A用B的公钥加密信息,然后将信息发给B;
4. B收到信息后,用自己的私钥解密。
也就是说,发送方用接收方的公钥加密,接收方用自己的私钥解密,这样信息就可以安全无误的到达了。但是依然存在以下问题:
1.A想发数据给B,那么B先生成一对密钥,然后将自己的公钥发给A。但是在发公钥的过程中很可能被第三方C截获。C截获B的公钥之后可能会做几件事:
(1)使用B的公钥对数据加密然后发给B,B此时无法分清这个消息是A发的还是C发的
(2)C自己生成一对密钥,将公钥发给A,A收到公钥以为是B发的,用这个公钥加密之后发消息给B,发给B的过程中被C拦截,C有私钥,可以知道消息的内容。
那么这些问题该如何解决呢?
只能靠一个第三方机构(CA机构,即证书授权机构)来担保。
此时的流程就是:
1. A要向B发送数据,B首先将公钥发给CA机构,CA机构收到B的公钥之后向B确认这个是否是B发送的公钥;
2. CA机构确认是B发送的公钥之后就会为B担保,生成一份数字证书给B,数字证书包含了CA的担保认证签名和B的公钥,A拿到CA的数字证书后,看到上面有CA的签名,就可以确定当前拿到的公钥是B发的,这样就可以放心的使用公钥加密数据然后发给B了
Tomcat服务器与加密解密
Tomcat服务器启动时会启动多个Connector(连接器),而Tomcat服务器的连接器又可以分为加密连接器和非加密连接器。在server.xml中有配置Connector:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
8080这个端口对应的连接器就是没有加密的Connector,在请求资源时我们的请求也是不加密的。要是想要以加密的方式来访问Tomcat服务器,就需要在Tomcat里配置一个加密的Connector。
浏览器与服务器交互时,浏览器想要将数据加密之后再发送给服务器,该怎么做呢?
首先,服务器要先向浏览器出示一份数字证书,浏览器看到数字证书之后,就可以使用数字证书里的公钥加密数据。因此得针对服务器生成一份数字证书。然后再配置一下服务器,让服务器收到浏览器的请求后,向浏览器出示它的数字证书。
生成Tomcat服务器的数字证书
sun公司提供了制作证书的工具keytool,在JDK1.4以后版本中都包含了这个工具,它在JAVA_HOME\bin\keytool.exe。使用keytool生成一个名为tomcat的证书,放在.keystore这个密钥库中。
keytool -genkey -alias tomcat -keyalg RSA
命令执行完之后,操作系统的用户文件夹下就会生成.keystore文件,如图:
可以使用指令查看.keystore密钥库里面的所有证书
keytool -list -keystore .keystore
配置HTTP连接器
将生成的.keystore密钥库文件拷贝到Tomcat服务器的conf目录下,如下图所示:
修改server.xml文件,配置HTTP连接器:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/.keystore" keystorePass="123456"/>
配置了一个端口是8443的加密连接器,浏览器访问8443端口的连接器时,将会以加密的方式访问web服务器,这个连接器收到浏览器的请求后,将会向浏览器出示一份数字证书,浏览器再用数字证书里的公钥来加密数据。服务器从密钥库中提取证书时需要密码,keystorePass这个属性就是指明了密码。
使用"https://localhost:8443/"访问8443的加密连接器
由于密钥库里的证书时我们自己生成的,并没有经过CA认证,所以在访问的时候,浏览器会出现"证书错误,导航已阻止"这种情况,浏览器会认为当前要访问的这个主机是不安全的,不推荐访问,点击"继续浏览此网站"即可。
安装数字证书
为了让浏览器信任我们生成的数字证书,需要将数字证书安装到浏览器中,以IE8为例来安装证书,过程如下:
证书安装成功后,重启IE浏览器,使用"https://localhost:8443/"访问8443的加密连接器,此时浏览器就不再提示证书错误了。
删除数字证书
工具----->Internet选项
删除后重启浏览器即可。