HTTPS和HTTP的区别

来源:互联网 发布:2016淘宝如何打造爆款 编辑:程序博客网 时间:2024/06/10 10:03

超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS和HTTP的区别主要为以下四点:

  1. https协议需要到ca申请证书,一般免费证书很少,需要交费。
  2. http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

使用说明

关于网络接口的调用这里不再过多说明,因为一般接口都会有详细的文档,比如:请求方式get/post、参数格式、返回类型等。

因为需要Openssl支持,使用SSL进行认证,所以需要对应的库文件-ssleay32.dll、libeay32.dll,可以参考:http://slproweb.com/products/Win32OpenSSL.html,我下载的版本为-Win32 OpenSSL v1.0.2g Light,将bin目录下面的库拷贝出来放到exe同级目录下即可。为了更好的兼容,最好是编译源码!

下面以HTTPS为例,描述一个完整的登录过程,也适用于HTTP及其它形式网络交互,比如:用户认证、上传、下载等。

MD5加密

为了安全起见,都会对敏感数据进行加密,而最常用的基本都是MD5。

QString md5(const QString &text){    QByteArray byteArray;    byteArray.append(text);    QByteArray hash = QCryptographicHash::hash(byteArray, QCryptographicHash::Md5);    return hash.toHex();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

HTTPS登录

进行SSL认证、设置传输的参数、设置消息头、开始请求、处理返回结果。

LoginNetworkManager::LoginNetworkManager(QObject *parent)    : QNetworkAccessManager(parent){    // SSL认证    m_sslConfig = QSslConfiguration::defaultConfiguration();    m_sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);    m_sslConfig.setProtocol(QSsl::TlsV1_2);    connect(this, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));}// 结束请求LoginNetworkManager::~LoginNetworkManager(){    if (m_pReply != NULL)    {        m_pReply->abort();        m_pReply->deleteLater();    }}// 设置登录数据void LoginNetworkManager::setParams(const QString &userName, const QString &password){    m_strUserName = userName;    m_strPassword = password;}void LoginNetworkManager::execute(){    QByteArray userNameByteArray = m_strUserName.toUtf8();    QByteArray userNameEncoding = userNameByteArray.toPercentEncoding();    // 设置发送的数据    QByteArray dataArray;    dataArray.append(QString("user_name=%1&").arg(QString(userNameEncoding)));    dataArray.append(QString("password=%1&").arg(md5(m_strPassword)));    dataArray.append("token_type=TOKEN");    // 设置消息头    QNetworkRequest request;    request.setSslConfiguration(m_sslConfig);    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");    request.setHeader(QNetworkRequest::ContentLengthHeader, dataArray.length());    request.setUrl(QUrl(LOGIN_URL));    // 开始请求    m_pReply = post(request, dataArray);}// 响应结束void LoginNetworkManager::replyFinished(QNetworkReply *reply){    QByteArray bytes = reply->readAll();    QString strUserID("");    int nCode = -1;    QJsonParseError jsonError;    QJsonDocument doucment = QJsonDocument::fromJson(bytes, &jsonError);    if (jsonError.error == QJsonParseError::NoError)    {        if (doucment.isObject())        {            QJsonObject object = doucment.object();            if (object.contains("userId"))            {                QJsonValue userID = object.take("userId");                if (userID.isString())                {                    strUserID = userID.toString();                }            }            if (object.contains("code"))            {                QJsonValue codeValue = object.take("code");                if (codeValue.isDouble())                {                    nCode = codeValue.toVariant().toInt();                }            }        }    }    // 发送结果数据    if (!strUserID.isEmpty())    {        emit onSuccess(strUserID);    }    else    {        emit onFail(nCode);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

使用方式

LoginNetworkManager *pLoginNetworkManager = new LoginNetworkManager(this);connect(pLoginNetworkManager, SIGNAL(onSuccess(const QString &)), this, SLOT(onSuccess(const QString &)));connect(pLoginNetworkManager, SIGNAL(onFail(int)), this, SLOT(onFail(int)));// 设置参数pLoginNetworkManager->setParams("test", "123456");pLoginNetworkManager->execute();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果处理

一般来说常用的返回格式为JSON、XML,当然也可以用特定格式的字符串,但大多数都是JSON较多。

得到结果后,我们就可以对返回的JSON进行解析,然后处理!

正确: 
“{“user_id”:”SELF-666666666_Qt-mr2Sj_9Iu92FWd-PqALbtwl6ZgtAFA”,”role”:1,”sex”:0,”user_name”:”test”,”create_date”:1449449966000}”

错误: 
{“msg”:”user_name=test and password is error.”,”code”:418,”error_msg”:”password is invalid”}

原创粉丝点击