Qt之HTTPS登录
来源:互联网 发布:微信斗图软件 编辑:程序博客网 时间:2024/06/06 03:28
简述
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的区别主要为以下四点:
- 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登录
- nagios插件之登录https页面监控
- Qt 之 使用 https:// 发送 HTTP请求
- Qt 之 使用 https:// 发送 HTTP请求
- Qt之QQ登录界面(一)
- Qt之QQ登录界面(二)
- Qt之QQ登录界面(三)
- Qt浅谈之三十四仿登录界面
- 1、cas4.0 单点登录 之 https证书
- WEB使用HTTPS登录
- tomcat 实现 https 登录
- tomcat实现https登录
- curl 登录https网站
- QT https post请求
- Qt 发送 https 请求
- Qt 发送 https 请求 .
- QT https post请求
- 用UglifyJS2合并压缩混淆JS代码
- 那些年,React 踩过的坑
- android studio
- android_万能适配器
- Adobe Photoshop Lightroom CC 2017 Mac(LR CC)附激活工具 V1.0中文破解版
- Qt之HTTPS登录
- HFDS 常用命令 fsck 查看文件信息和block位置信息
- Ubuntu Linux定时备份数据库,并上传到阿里云OSS
- 通过http请求传递xml流和接收xml流的代码示例
- ValueStack笔记
- android实现静默更新安装并自动启动
- sigsuspend()函数作用
- 朱啸虎不投60后被怼毫无教养,投资人拿钱砸人都如此狂妄自大吗?
- Android DialogFragment在屏幕旋转之后,输入框内的文字消失的原因