今天在请求数据的数据的时候,服务器使用的是https 请求,相对安全些,但是结果让我请求图片和资源的时候也使用https 请求,我之前写的http 请求根本用不了!我就感到非常的不爽!最后听公司的人说了下,最后他们决定 重要信息使用hpps 访问,但是对于资源什么的就使用http 吧! 开始没什么认识,只感觉到使用https 请求数据的时候,要经过安全验证,安全性很高!度娘了下!原来使用https 是要分场合的!不是什么时候都可以用的!https 是为了安全性而设置的,要验证很多的信息!相对应 http 请求的速度肯定有点慢!最后看到下面的帖子,才明白,如果使用https 的话很麻烦的,无意给服务器和客户端增加了很大的压力! 所以呢,平时最好不要使用https , 如果牵扯到个人隐私或者是其他的什么重要信息就一定要这么做了!很多的时候你感觉有点问题,但是如果不去细细发觉的话,暂时没有什么问题,但是在你后面的维护,或者出问题的时候会弄的头痛不已!为了以后的方便,还是此刻就好好的把每一件事做好,分析好!
微软的很多网站都是通过https 加密过的!用户的登陆验证过程还可以理解,没有想到所有的文件资源居然也是通过https去访问,这个其实就做的过于安全了。 一个几十兆的流文件,光服务端加密估计就要消耗很多cpu和能源了,不过微软的服务器够power。 我们的客户端浏览器 对这些数据要进行解密验证,其实也耗费了很多的资源。那就稍微说下,在我们Android程序里面访问服务器请求的时候尽量少使用 https 请求数据!否则非常的消耗性能!把精力用在适当的地方!
如果说我说的很浮亏,那么我们就好好看看https 的性能吧:
1. HTTPS 一定要有明确的选择理由.
a) HTTPS 实际上是SSL用于HTTP.
b) 主要解决了两部分的问题.
i.
1. 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server ,采用的证书不管自己issue 还是从公众的地方issue, 客户端都是自己人,所以我们也就肯定信任该server.
ii.
2. 通讯过程中的数据的泄密和被窜改. 这里有两个层次
1. 一般意义上的https, 就是 server 有一个证书.
a) 主要目的是保证server 就是他声称的server. 这个跟低一点一样.
b) 服务端和客户端中件的所有通讯,都是加密的.
i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的握手过程.
ii. 加下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥. 当然窜改也就没有什么意义了.
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书.
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 应为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份.
b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体.
(目前这种协议用于银行等金融里面比较多,例如炒股软件,工商银行什么的!)
2. HTTPS 一定是expensive的.
a) 本来简单的http协议,一个 get 一个response. 由于https 要还密钥和确认加密算法的需要.单握手就需要6/7 个往返.
i. 任何应用中,过多的round trip 肯定影响性能.
b) 接下来才是具体的http协议,每一次响应或者请求, 都要求客户端和服务端对会话的内容做加密/解密.
i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求.
ii. 加密后数据量的影响.
1. 这个我用128bit 的RC2 测试了一下,加密后数量跟加密前基本相同.
3. HTTP VS HTTPS 的性能
a) 这个由于很多人测试的背景不一样,由于时间太紧,我没有写出了一个类似 ACT 一样测试web https 的压力工具. 看了一下别人的观点.
b) 有些人说https 的性能是 http 的 40 % , 有些人说可能80%.
c) 我的观点.
i. https 的关键性能影响是 CPU 和往返. 如果CPU 很强的话, 性能可能就是有人讲的80%. 如果cpu 是瓶颈的话, 有人讲原来可以server 330-500个请求每秒,现在只有30-50%
ii. 不需要用https 的地方,就尽量不要用.
这就是区别!
因此在使用https 请求数据的时候要注意看看你的项目里面是否真的需要! 我在此给你一段 使用Android访问https 的代码:
private X509TrustManager xtm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) {
// System.out.println("cert: " + chain[0].toString() + ", authType: "
// + authType);
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
private HostnameVerifier hnv = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
//读取证书
return true;
}
};
private HttpsUtils() {
SSLContext sslContext = null;
try {
sslContext = SSLContext.getInstance("TLS");
X509TrustManager[] xtmArray = new X509TrustManager[] { xtm };