Qt之HTTPS登录

简述

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

  • 简述
  • HTTPS和HTTP的区别
  • 使用说明
    • MD5加密
    • HTTPS登录
  • 使用方式
  • 结果处理

HTTPS和HTTP的区别

超文本传输协议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();
}

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);
    }
}

使用方式

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();

结果处理

一般来说常用的返回格式为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”}

时间: 2024-11-08 12:08:52

Qt之HTTPS登录的相关文章

实例-Qt QSettings 保存登录界面的一些问题

问题描述 Qt QSettings 保存登录界面的一些问题 Qt QSettings 究竟是怎样保存用户名和密码的?跪请各路大神实例.. 解决方案 见博客,具体已在博客里面详细解决

QT语音怎么修改语音设置

  首先在QT语音里登录自己的QQ帐号,并且进入系统设置界面里的语音设置 也可以在QT语音的图标上点击右键,并且选择语音设置这个选项功能. 在里面可以设置自己的增益,当然如果不正常可以关闭相应选项

httpclient提交https表单

问题描述 我最近的项目需要得到一个https网站的页面信息,我们需要登陆后获得一些相应的用户信息,但是我被卡在了第一步,我每次提交一个form的时候都会报如下的错误:javax.net.ssl.SSLPeerUnverifiedException:peernotauthenticatedatcom.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)atorg.apache.htt

Android实现QQ登录界面遇到问题及解决方法_Android

先给大家炫下效果图: 首先过程中碰到的几个问题: 1.对 EditText 进行自定义背景 2.运行时自动 EditText 自动获得焦点 3.在获得焦点时即清空 hint ,而不是输入后清空 4.清空按钮的出现时机(在得到焦点并且有输入内容时) ......... --- 这些问题都有一一解决 --- 以下是代码: 布局 fragment_main(问题2) <!-- android:focusable="true" android:focusableInTouchMode=&

代码-windoows c++ 客户端http 登录 wordpress

问题描述 windoows c++ 客户端http 登录 wordpress 我想做一个windows c++ 客户端,后台服务器打算就做成一个 wordpress, 有登录功能,就像QQ 和迅雷一样, 客户端通过http登录到 服务端,session 一直保持, 直到用户退出客户端, session 关闭. 哪个可以说一个实现方法 或者 有什么现成的开源方案, 主要问题:c++客户端怎么模拟http登录到wordpress, wordpress 有验证码 , 所以客户端要有验证码输入功能, 我

哪位高人帮我解决一个困扰我几天的问题,httpwebrequest 访问 https

问题描述 使用httpwebrequest来模拟浏览器访问网页,提交数据,前面几个网页的提交和返回都没有问题,但是到用户登录页面的时候,请求一个登录跳转页面,服务器返回302跳转到https登录页面的时候,老是返回会话超时页面,正确的应该是返回登录页面,不知道是什么原因.是不是cookies设置有问题,还是httpwebrequest在http和https跳转的时候需要什么特殊的设置?在线等啊. 解决方案 解决方案二:高人过来啊,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Qt之格栅布局(QGridLayout)

简述 QGridLayout:格栅布局,也被称作网格布局(多行多列). 栅格布局将位于其中的窗口部件放入一个网状的栅格之中.QGridLayout需要将提供给它的空间划分成的行和列,并把每个窗口部件插入并管理到正确的单元格. 栅格布局是这样工作的: 它计算了位于其中的空间,然后将它们合理的划分成若干个行(row)和列(column),并把每个由它管理的窗口部件放置在合适的单元之中,这里所指的单元(cell)即是指由行和列交叉所划分出来的空间. 在栅格布局中,行和列本质上是相同的,只是叫法不同而已

qt语音积分怎么获得 qt语音获得积分教程

这个积分获得条件是需要你在主播的房子里呆到一定时间就可以获得积分了,具体技巧小编为各位分享一个. 1.我们打开 QT, 然后随便登录进入一个房间,然后我们如果要听就在这里听,如果不听点击 设置静音 如下图所示 3.只要在房间里呆一小时我们就可以获得一积分,一天最多可以获得5积分 注意:关于获得积分的规则是在同一个房间呆5小时就可以获得5个积分了,所以我们如果不可以可以静音了,然后让他放了这样可以获得积分了.

webseal 登录问题

问题描述 我在安装完webseal后,用http方式可以登录,但是用https却无法登录,,请大侠们支个招https登录时日志报错:2011-09-05-08:39:14.144+08:00I-----0x16B480C9websealdERRORrgyiraira_entry.c29930x0353eb90HPDRG0201EErrorcode0x51wasreceivedfromtheLDAPserver.Errortext:"Can'tcontactLDAPserver".201