一、HTTPS
HTTP是超文本传输协议,那HTTPS是什么尼?要明白HTTPS是什么先要明白HTTP的缺点,想一下我们在使用HTTP的时候会有那些缺点尼?
1.通信使用的明文(不加密),内容可能会被窃听;
2.不验证客户端或者服务器的身份,有可能被伪装;
3.无法确定报文的完整性,可能已经被串改;
假如当我们遇到这些情况的时候怎么处理尼?这时候我们就应该这样处理HTTP+加密明文+认证身份+报文完整性;这样就确保了我们访问的安全性和完整性,就是我们所要说的HTTPS,HTTPS就是超文本传输安全协议,通常情况下我们是HTTP+TCP进行客户端和服务器的通信,这是普通的HTTP协议,HTTPS则是先和SSL通信,然后SSL在和TCP通信,所以说不难想象HTTPS就是HTTP+SSL。那接下来我们介绍一下HTTPS是怎么进行安全通信的;
使用对称加密确保了客户端与服务器数据的安全性,这样又来一个问题什么是对称加密,对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。那问题又来了非对称加密是什么?非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。这样我们好像将问题全部解决了,数据就可以安全的传递了,其实不然这里还有一个问题如何服务器的公钥准确无误的传递给客户端?这样是不是诞生了无穷尽的循环,好在给我们提供了一个决解方案,那就是CA证书,通过它建立我们的信任基点,就可以保证服务器公钥被正确的传递给客户端,然后浏览器可以使用它安全的把对称加密的密钥传递给服务器,之后以此密钥加密需要传递的信息,保证了数据的安全性。可能这里你还有问题,为什么不直接都是非对称加密?原因是非对称加密的计算效率远远不如对称加密,会造成服务器压力过大;这样我们基本就了解清楚HTTPS怎么嘛保证数据安全性的;
二、HTTP认证方式
1.BASIC认证(基本认证)
public class FirstWebSocketController : ApiController { public HttpResponseMessage Get() { if (HttpContext.Current.IsWebSocketRequest) { HttpContext.Current.AcceptWebSocketRequest(ProcessWSChat); } return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols); } private async Task ProcessWSChat(AspNetWebSocketContext arg) { WebSocket socket = arg.WebSocket; while (true) { ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]); WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); if (socket.State == WebSocketState.Open) { string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count); string returnMessage = "You send: " + message + ".at" + DateTime.Now.ToLongTimeString(); buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(returnMessage)); await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } else { break; } } } }
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> <script src="~/js/jquery-1.8.3.min.js"></script> <script type="text/javascript"> $(function () { var ws; $("#btnConnect").click(function () { $("#messageSpan").text("Connection..."); ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/FirstWebSocket"); ws.onopen = function () { $("#messageSpan").text("Connected!"); }; ws.onmessage = function (result) { $("#messageSpan").text(result.data); }; ws.onerror = function (error) { $("#messageSpan").text(error.data); }; ws.onclose = function () { $("#messageSpan").text("Disconnected!"); }; }); $("#btnSend").click(function () { if (ws.readyState == WebSocket.OPEN) { ws.send($("#txtInput").val()); } else { $("messageSpan").text("Connection is Closed!"); } }); $("#btnDisconnect").click(function () { ws.close(); }); } ) </script> </head> <body> <div> <input type="button" value="Connect" id="btnConnect" /> <input type="button" value="DisConnect" id="btnDisConnect" /> <hr /> <input type="text" id="txtInput" /> <input type="button" value="Send" id="btnSend" /> <br /> <span id="messageSpan" style="color:red;"></span> </div> </body> </html>