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的区别
超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
- https协议需要到ca申请证书,一般免费证书很少,需要交费。
- http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- 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”}
Qt之HTTPS登录的更多相关文章
- Qt之HTTPS登录(集成QNetworkAccessManager提前修改QSslConfiguration,然后post)
简述 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP ...
- Qt常用的登录界面设计
记录一下Qt常用的登录界面的设计 方便以后使用! 1.QpushButton改变一个按钮的颜色,当鼠标放上去和移开时显示不同的颜色.QPushButton { background-color: rg ...
- (HTTPS)-tomcat 实现 https 登录,去掉端口号
最近项目组要给日本客户做个产品,升级服务器交由我来升级.为了测试用,想要在自己电脑上搭个服务器. 服务器需要由https登录,并且不显示端口号. 费了些劲儿,看了n多帖子,好不容易弄好了.趁在没忘记之 ...
- GS使用HTTPS登录的设置过程
1. Windows 增加角色服务 服务器配置管理器, 添加角色服务 增加角色功能里面有: 证书颁发机构 证书颁发机构 web注册 2. AD CS配置 主要是next操作 独立ca 根证书 等 3. ...
- shell实现https登录
服务端提供了两个api: 一个是用于用户认证,因为要传输密钥,所以用了https方式 如何在服务端配置https请见另外一个博文 https://192.168.1.190:8443/api/aut ...
- Qt 发送 https 请求
1.环境 ubuntu 12.04 Qt库版本 4.8.1(安装包是Nokia时期的sdk,现在已经不好找了) 2.网上一查都说 Qt 默认不支持Openssl,心想那https也肯定用不了啊,然后屁 ...
- QT Designer基础——登录界面设计基础版2
认识QT Designer提供的可选控件:以下八个大类 Layouts:布局相关 Spacers:留空 Buttons:可点击的按钮类 Item Views和 Item Widgets:高级控件,例如 ...
- 使用Qt发送HTTPS请求
示例代码: #include "mainwindow.h" #include "ui_mainwindow.h" #include <QNetworkAc ...
- QT Designer基础——登录界面设计基础版
认识QT Designer提供的可选控件:以下八个大类 Layouts:布局相关 Spacers:留空 Buttons:可点击的按钮类 Item Views和 Item Widgets:高级控件,例如 ...
随机推荐
- Unity3D 批量图片资源导入设置
原地址:http://blog.csdn.net/asd237241291/article/details/8433548 创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[] 本 ...
- javascript中onclick事件能调用多个方法吗
Q: javascript中onclick事件能调用多个方法吗? A: 可以的,方法如下onclick="aa();bb();cc();"每个方法用“;”分号隔开就行了
- uva 12589 - Learning Vector
思路: 容易知道加向量的顺序是按向量斜率的大小顺序来的.由于数据不是很大,可以用背包解决!! dp[i][j]:加入最大面积为i时,加入了j个向量. 代码如下: #include<iostrea ...
- Lucene基于IKAnalyzer配置的词典扩充
在web项目的src目录下创建IKAnalyzer.cfg.xml文件,内容如下 <?xml version="1.0" encoding="UTF-8" ...
- JS面向(基于)对象编程--构造方法(函数)
构造函数(方法)介绍 什么是构造函数呢?在回答这个问题之前,我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接 ...
- 怎样查看Tomcat动态控制台信息
在web项目调试期间,时常需要查看输出的调试信息,例如当hibernate设置为显示SQL语句时,每次运行的SQL语句会输出到终端,另外有时需要在代码中插入一些输出语句,以方便掌握运行情况,但当插入S ...
- 如何向AcmeAir注入问题代码
为什么要注入问题代码? AcmeAir的常规代码是为了压测测试准备的,所以绝大部分的操作都是可以在几十毫秒中就可以正常返回的.为了向用户展示我们APM工具可以在源代码级别发现系统潜在问题,我们需要在A ...
- 【web性能】web性能测试工具推荐
WEB性能测试工具主要分为三种,一种是测试页面资源加载速度的,一种是测试页面加载完毕后页面呈现.JS操作速度的,还有一种是总体上对页面进行评价分析,下面分别对这些工具进行介绍,如果谁有更好的工具也请一 ...
- Android 音乐播放器之--错误状态下调用导致的异常
MediaPlayer必须在合适的状态下调用合适的方法,否则会出现异常,下面列出常见错误信息和说明: 1.E/MediaPlayer(11310): stop called in state 1 调用 ...
- SpringMVC整合Shiro——(3)
SpringMVC整合Shiro,Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能. 第一步:配置web.xml <!-- 配置Shiro过滤器,先让Shiro ...