使用Wireshark与Burp Suite分析HTTPS协议

2023-10-26

目录

目的

内容

器材(设备、元器件)

步骤

1.虚拟机服务器搭建网站,本机访问用Burp Suite抓包获取头信息。

2.Wireshark和Burp Suite处理HTTPS的过程与技术实现过程原理

(1)Wireshark

(2)Burp Suite

3.在QT中编写HTTP程序并运行。

代码


  • 目的

了解HTTPS是如何加密,SSL加密过程。

  • 内容

1.虚拟机服务器搭建网站,本机访问用Burp Suite抓包获取头信息。

2.描述Wireshark和Burp Suite处理HTTPS的过程和两者的技术实现过程原理。

3.在QT中编写HTTP程序并运行。

  • 器材(设备、元器件)

Wireshark、Burp Suite、IIS搭建网站的虚拟机windows2003系统

  • 步骤

1.虚拟机服务器搭建网站,本机访问用Burp Suite抓包获取头信息。

①在虚拟机中搭建了网站,在本机中用火狐浏览器访问IP并用Burp Suite抓包。

②关闭抓包后,网站可访问

2.Wireshark和Burp Suite处理HTTPS的过程与技术实现过程原理

(1)Wireshark

原理:

HTTPS(Hypertext TransferProtocol over Secure Socket Layer,基于SSL的HTTP协议),端口443,需要向CA申请证书,通过SSL握手建立安全通道,利用协商密钥对数据进行对称加密通信。

SSL协议栈位置介于TCP和应用层之间,分为SSL记录协议层和SSL握手协议层。

SSL握手:

1、  初始化阶段。客户端创建随机数,发送ClientHello 将随机数连同自己支持的协议版本、加密算法和压缩算法发送给服务器。服务器回复ServerHello将自己生成的随机数连同选择的协议版本、加密算法和压缩算法给客户端。

2、  认证阶段。服务器发送ServerHello的同时可能将包含自己公钥的证书发送给客户端(Certificate),并请求客户端的证书(Certificate Request)。

3、  密钥协商阶段。客户端验证证书,如果收到Certificate Request则发送包含自己公钥的证书,同时对此前所有握手消息进行散列运算,并使用加密算法进行加密发送给服务器。同时,创建随机数pre-master-secret并使用服务器公钥进行加密发送。服务器收到这个ClientKeyExchange之后解密得到pre-master-secret。服务器和客户端利用1阶段的随机数,能够计算得出master-secret。

4、  握手终止。服务器和客户端分别通过ChangeCipherSpec消息告知伺候使用master-secret对连接进行加密和解密,并向对方发送终止消息(Finished)。

抓包分析:

使用wireshark过滤ssl流量,可以看到有几个明显的ssl会话建立包,例如client hello,server hello等;

①蓝色的就是我们客户端向服务器发送hello ,即浏览器向服务器请求一个安全的网页。

然后双击这个Client Hello看下传输的内容:

②服务器就把它的证书和公匙发回来,同时向服务端发送ACK报文以便服务端确认数据是否无误。

server hello包里能看到服务端选择的加密算法;

服务器发送ServerHello的同时可能将包含自己公钥的证书发送给客户端(Certificate);

③客户端验证证书,如果收到Certificate Request则发送包含自己公钥的证书,同时对此前所有握手消息进行散列运算,并使用加密算法进行加密发送给服务器;

 ④服务器端发送change_cipher_specfinished消息。到这里握手结束。

(2)Burp Suite

原理:

BurpSuite的基本思路是伪装成目标https服务器,让浏览器(client)相信BurpSuite就是目标站点。

为了达成目标,BurpSuite必须:(1)生成一对公私钥,并将公钥和目标域名绑定并封装为证书;(2)让浏览器相信此证书,即通过证书验证。所以, BurpSuite需要在操作系统添加一个根证书,这个根证书可以让浏览器信任所有BurpSuite颁发的证书。具体流程如下:

 

之后,BurpSuite拥有了两套对称密钥,一套用于与client交互,另外一套与server交互,而在BurpSuite处可以获得https明文。

抓包分析:

①打开Burp Suite,连接百度:

②在Target中只查看baidu

③过滤显示:

3.在QT中编写HTTP程序并运行。

在pro文件中配置:

LIBS=-lpcap -lnet -lnids

代码

(C语言,源自《网络数据与协议分析》)

#include "nids.h"
#include "pcap.h"
#include "libnet.h"

char ascii_string[10000];
char *char_to_ascii(char ch)
/* 此函数的功能主要用于把协议数据进行显示 */
{
    char *string;
    ascii_string[0] = 0;
    string = ascii_string;
    if (isgraph(ch))
     /* 可打印字符 */
    {
        *string++ = ch;
    }
    else if (ch == ' ')
     /* 空格 */
    {
        *string++ = ch;
    }
    else if (ch == '\n' || ch == '\r')
     /* 回车和换行 */
    {
        *string++ = ch;
    }
    else
     /* 其它字符以点"."表示 */
    {
        *string++ = '.';
    }
    *string = 0;
    return ascii_string;
}

void parse_client_data(char content[],int number)
{
    char temp[1024];
    char str1[1024];
    char str2[1024];
    char str3[1024];
    int i,j,k;
    char entity_content[1024];
    if(content[0]!='H' && content[1]!='T' && content[2]!='T' && content[3]!='P')
    {
        printf("实体内容为(续):\n");
        for(i=0;i<number;i++)
        {
            printf("%s",char_to_ascii(content[i]));
        }
        printf("\n");
    }
    else
    {
        for(i=0;i<strlen(content);i++)
        {
            if(content[i]!='\n')
            {
                k++;
                continue;
            }
            for(j=0;j<k;j++)
            {
                temp[j]=content[j+i-k];
            }
            temp[j]='\0';
            if(strstr(temp,"HTTP"))
            {
                printf("状态行为:");
                printf("%s\n",temp);
                sscanf(temp,"%s%s",str1,str2);
                printf("HTTP协议为:%s\n",str1);
                printf("状态代码为:%s\n",str2);
            }
            if(strstr(temp,"Date"))
            {
                printf("当前的时间为(Date):%s\n",temp+strlen("Date:"));
                printf("%s\n",temp);
            }
            if(strstr(temp,"Server"))
            {
                printf("服务器为(Server):%s\n",temp+strlen("Server:"));
                printf("%s\n",temp);
            }
            if(strstr(temp,"Cache-Control"))
            {
                printf("缓存机制为(Cache-Control):%s\n",temp+strlen("Cache-control:"));
                printf("%s",temp);
            }
            if(strstr(temp,"Expires"))
            {
                printf("资源期限为(Expires):%s\n",temp+strlen("Expires:"));
                printf("%s",temp);
            }
            if(strstr(temp,"Last-Modified"))
            {
                printf("最后一次修改的时间为(Last-Modifid):%s\n",temp+strlen("Last-Modifid:"));
                printf("%s",temp);
            }
            if(strstr(temp,"ETag"))
            {
                printf("ETag为(ETag):%s\n",temp+strlen("ETag:"));
                printf("%s",temp);

            }
            if(strstr(temp,"Accept-Ranges"))
            {
                printf("Accept-Ranges(Accept-Ranges):%s\n",temp+strlen("Accept-Ranges:"));
                printf("%s",temp);

            }
            if(strstr(temp,"Content-Length"))
            {
                printf("内容长度为(Content-Length):%s\n",temp+strlen("Content-Length:"));
                printf("%s",temp);
            }
            if(strstr(temp,"Connection"))
            {
                printf("连接状态为(Connection):%s\n",temp+strlen("Connection:"));
                printf("%s",temp);
            }
            if(strstr(temp,"Content-Type"))
            {
                printf("内容类型为(Content-Type):%s\n",temp+strlen("Content-Type:"));
                printf("%s",temp);
            }
            if((content[i]=='\n') && (content[i+1]='\r'))
            {
                if(i+3==strlen(content))
                {
                    printf("无实体内容\n");
                    break;
                }
                for(j=0;j<number-i-3;j++)
                {
                    entity_content[j]=content[i+3+j];
                }
                entity_content[j]='\0';
                printf("实体内容为:\n");
                for(i=0;j<j;i++)
                {
                    printf("%s",char_to_ascii(entity_content[i]));
                }
                printf("\n");
                break;
            }
            k=0;
        }
    }
}

void parse_server_data(char content[],int number)
{
    char temp[1024];
    char str1[1024];
    char str2[1024];
    char str3[1024];
    int i,j,k;
    char entity_content[1024];
    for(i=0;i<strlen(content);i++)
    {
        if(content[i]!='\n')
        {
            k++;
            continue;
        }
        for(j=0;j<k;j++)
        {
            temp[j]=content[j+i-k];
        }
        temp[j]='\0';
        if(strstr(temp,"GET"))
        {
            printf("请求行为:");
            printf("%s\n",temp);
            sscanf(temp,"%s%s%s",str1,str2,str3);
            printf("使用的命令为:%s\n",str1);
            printf("获得的资源为:%s\n",str2);
            printf("HTTP协议类型为:%s\n",str3);
        }
        if(temp,"Accept:")
        {
            printf("接收的文件包括(Accept):%s",temp+strlen("Accept:"));
            printf("%s\n",temp);
        }
        if(temp,"Referer:")
        {
            printf("转移地址为(Referer):%s",temp+strlen("Referer:"));
            printf("%s\n",temp);
        }
        if(temp,"Accept-Language:")
        {
            printf("使用的语言为(Accept-Language):%s",temp+strlen("Accept-Language:"));
            printf("%s\n",temp);
        }
        if(temp,"Accept-Encoding:")
        {
            printf("接收的编码方式为(Accept-Encoding):%s",temp+strlen("Accept-Encoding:"));
            printf("%s\n",temp);
        }
        if(temp,"If-Modified-Since:")
        {
            printf("上次修改的时间为(If-Modified-Since):%s",temp+strlen("If-Modified-Since:"));
            printf("%s\n",temp);
        }
        if(temp,"If-None-Match:")
        {
            printf("If-None-Match为(If-Modified-Since):%s",temp+strlen("If-None-Match:"));
            printf("%s\n",temp);
        }
        if(temp,"User-Agent:")
        {
            printf("用户的浏览器信息为(User-Agent):%s",temp+strlen("User-Agent:"));
            printf("%s\n",temp);
        }
        if(temp,"Host:")
        {
            printf("访问的主机为(Host):%s",temp+strlen("Host:"));
            printf("%s\n",temp);
        }
        if(temp,"Connection:")
        {
            printf("连接状态为(Connection):%s",temp+strlen("Connection:"));
            printf("%s\n",temp);
        }
        if(temp,"Cookie:")
        {
            printf("Cookie为(Cookie):%s",temp+strlen("Cookie:"));
            printf("%s\n",temp);
        }
        if((content[i]=='\n') && (content[i+1]='\r') && (content[i+2=='\n']))
        {
            if(i+3==strlen(content))
            {
                printf("无实体内容\n");
                break;
            }
            for(j=0;j<strlen(content);j++)
            {
                entity_content[j]=content[i+3+j];
            }
            entity_content[j]='\0';
            printf("实体内容为:\n");
            printf("%s",entity_content);
            printf("\n");
            break;
        }
        k=0;
    }
}

void http_protocol_callback(struct tcp_stream *tcp_http_connection,void **param)
{
    char address_content[1024];
    char content[65535];
    char content_urgent[65535];
    struct tuple4 ip_and_port=tcp_http_connection->addr;
    strcpy(address_content,inet_ntoa(*((struct in_addr*)&(ip_and_port.saddr))));
    sprintf(address_content+strlen(address_content),":%i",ip_and_port.source);
    strcat(address_content,"<----->");
    strcat(address_content,inet_ntoa(*((struct in_addr*)&(ip_and_port.daddr))));
    sprintf(address_content+strlen(address_content),"%i:",ip_and_port.dest);
    strcat(address_content,"\n");
    if(tcp_http_connection->nids_state==NIDS_JUST_EST)
    {
        if(tcp_http_connection->addr.dest!=80)
        {
            return;
        }
        tcp_http_connection->client.collect++;
        tcp_http_connection->server.collect++;
        printf("\n\n\n\==============================\n");
        printf("%s建立连接...\n",address_content);
        return;
    }
    if(tcp_http_connection->nids_state==NIDS_CLOSE)
    {
        printf("-------------------------------\n");
        printf("%s连接正常关闭...\n",address_content);
        return;
    }
    if(tcp_http_connection->nids_state==NIDS_RESET)
    {
        printf("--------------------------------\n");
        printf("%s连接被RST关闭...\n",address_content);
        return;
    }
    if(tcp_http_connection->nids_state==NIDS_DATA)
    {
        struct half_stream *hlf;
        if(tcp_http_connection->client.count_new)
        {
            hlf=&tcp_http_connection->client;
            strcpy(address_content,inet_ntoa(*((struct in_addr*)&(ip_and_port.saddr))));
            sprintf(address_content+strlen(address_content),":%i",ip_and_port.source);
            strcat(address_content,"<-----");
            strcat(address_content,inet_ntoa(*((struct in_addr*)&(ip_and_port.daddr))));
            sprintf(address_content+strlen(address_content),"%i:",ip_and_port.dest);
            strcat(address_content,"\n");
            printf("\n");
            printf("%s",address_content);
            printf("浏览器接收数据...\n");
            printf("\n");
            memcpy(content,hlf->data,hlf->count_new);
            content[hlf->count_new]='\0';
            parse_client_data(content,hlf->count_new);
        }
        else
        {
            hlf=&tcp_http_connection->server;
            strcpy(address_content,inet_ntoa(*((struct in_addr*)&(ip_and_port.saddr))));
            sprintf(address_content+strlen(address_content),":%i",ip_and_port.source);
            strcat(address_content,"<-----");
            strcat(address_content,inet_ntoa(*((struct in_addr*)&(ip_and_port.daddr))));
            sprintf(address_content+strlen(address_content),"%i:",ip_and_port.dest);
            strcat(address_content,"\n");
            printf("\n");
            printf("%s",address_content);
            printf("服务器接收数据...\n");
            printf("\n");
            memcpy(content,hlf->data,hlf->count_new);
            content[hlf->count_new]='\0';
            parse_server_data(content,hlf->count_new);
        }
    }
    return;
}
int main()
{
    //close xiaoyanhe
    struct nids_chksum_ctl temp;
    temp.netaddr = 0;
    temp.mask = 0;
    temp.action = 1;
    nids_register_chksum_ctl(&temp,1);
    if(!nids_init())
    {
        printf("出现错误:%s\n",nids_errbuf);
        exit(1);
    }
    nids_register_tcp(http_protocol_callback);
    nids_run();
    return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Wireshark与Burp Suite分析HTTPS协议 的相关文章

  • 创建 ManagedCertificate 会导致“状态:FailedNotVisible”

    使用 Kubernetes 1 12 6 gke 7 或更高版本 可以创建一个 ManagedCertificate 然后从将服务暴露到互联网的入口资源中引用该证书 运行 kubectl describe Managedcertificat
  • IIS 503 通过 HTTPS“服务不可用”,HTTP 工作正常

    我有一个在 IIS 7 5 中运行的网站 当我通过 HTTP 访问该网站时 一切正常 当我通过 HTTPS 运行该网站时 我立即地收到 HTTP 503 错误 服务不可用 网站上使用的 SSL 证书是自生成 自签名的 以下是我见过的类似问题
  • 如何使用 https 运行 Vue.js 开发服务?

    我正在使用 Vue cli 使用 webpack 模板创建 vue 项目 如何在开发中使用 https 运行它 npm run dev 在最新的vuejs 截至2018年5月7日 中 需要在项目根目录下添加一个 vue config js
  • 机架 Web 服务器和 https:教程?

    任何人都可以提供使用 Ruby RACK Web 服务器处理 https 和 installint 证书等设置的描述或教程的链接吗 Thanks Rack 不是网络服务器 它是网络服务器 如 Apache nginx 和应用程序中间件之间的
  • Amazon S3 - HTTPS/SSL - 可能吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我看到了一些与此相关的其他问题 但没有任何真正的答案或信息 或者看起来如此 我这里有一张图片 http furniture retailcatalog
  • 轻量级加密密钥交换协议

    我有一个嵌入式系统通过 HTTP 将数据发布到 JSON REST 服务 我目前正在使用 HMAC SHA1 进行身份验证 方式与亚马逊AWS http docs amazonwebservices com AWSSimpleQueueSe
  • Spring Security 3.1.0 - 无法从 HTTPS 切换到 HTTP

    我是 Spring Security 的新手 所以我制作了一个小型 Web 应用程序 以便尝试它并找到对我正在从事的项目有用的配置 我强制通过 HTTPS 访问登录页面 登录后需要切换回 HTTP 换句话说 登录页面 仅限 HTTPS 其他
  • 使用 HTTPS 链接与 php 方法(file_get_contents、getimagesize)

    当我尝试读取网站中的某些 HTTPS 网址时遇到问题 如果我使用 http 则没有问题 使用file get contents和curl 但是当我用 https 替换 http 时 这些方法不起作用 我收到一些错误 failed to op
  • 同一 IP 443 端口中的多个域

    我在 IIS 7 的端口 443 https 上托管了一个网站 www example1 com 现在我为同一 IP 的 www example2 com 购买了一个新域 我想在此域中托管另一个网站 www example2 com htt
  • fiddler2无法生成证书

    我正在使用 Fiddler2 或尝试 捕获访问 https Web 服务的 Windows 桌面小工具的 SSL 流量 它曾经可以工作 然后几天前就停止了 总是出现以下错误 Unable to Generate Certificate Cr
  • 我无法使用 LWP::UserAgent 连接到任何 HTTPS 站点

    我正在尝试创建一个仅连接到网站的脚本 但是 由于某种原因 它不会连接到使用 HTTPS 的任何内容 我们在这里启用了代理 但是 我相信代理不是问题 因为如果我要连接到网络内部不通过代理建立隧道的 HTTPS 它仍然会失败 如果我要在任何不使
  • 如何从一个端口为 Jetty 提供 https 和 http 服务?

    我知道这是一个重复的问题 但原始发帖者提出这个问题的原因是错误的 我并不是暗示我问它是为了right原因 但让我们看看 我们有一个在非标准端口号上运行的 Web 服务 尽管用户似乎能够记住端口号 但有时他们会错误地输入 http 而不是 h
  • 如何让wildfly localhost连接自动变成https?

    我需要在本地主机上使用 https 协议测试我的 Web 应用程序 我怎样才能在wildfly上配置设置以使https localhost 8443 myapp html works New 我将其添加到我的安全领域
  • 如何在 Cocoa Touch 中验证网站证书?

    我目前使用 NSURLConnection 打开到 Web 服务器的 https 连接 一切正常 我能够检索我想要的页面内容 该证书是由 VeriSign 颁发的 我假设 NSURLConnection 做了一些工作来在某种程度上验证证书的
  • 使用 python mechanize 库登录 https 站点

    我有以下代码 import requests import sys import urllib2 import re import mechanize import cookielib import json import imp prin
  • 如何使用代理将 boost::asio 连接到 HTTPS 服务器?

    在我们的应用程序中 我们使用 boost asio 来使用 HTTP 和 HTTPS 进行连接 我们还可以使用 HTTP 代理 现在我需要使用代理添加对 HTTPS 服务器的支持 我研究了相当多的样本 发现所需的步骤似乎是 创建到代理的 H
  • 通过 HTTPS 包含 Twitter Widgets.js

    当我们包含以下内容时 我在我们网站上的 HTTPS 服务页面上的混合内容方面遇到了一个小问题http platform twitter com widgets js http platform twitter com widgets js
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • 有没有一种方法可以在不停机的情况下更新 net/http 服务器中的 TLS 证书?

    我有一个简单的 https 服务器 提供一个简单的页面 如下所示 为简洁起见 没有错误处理 package main import crypto tls fmt net http func main mux http NewServeMux
  • HTTP 到 HTTPS 301 重定向代码不起作用,显示重定向过多

    我正在为我的网站之一使用 Bluehost 最近 最近 我已将我的网站从 HTTP 迁移到 HTTPS 之后 我使用了不同的代码 包括以下代码 在我的网站上强制使用 HTTPS SSL Rewrite RewriteEngine On Re

随机推荐

  • win10 python如何安装requests———超详细教程

    第一步 先检查你的python安装路径下的Scripts文件里有没有东西 我一开始查看时发现竟然是空白的 去搜寻了答案 python安装文件中 Scripts文件夹中没有文件目录 空白 注 我只是操作了该教程中的第二步 在cmd中输入pyt
  • 区块链的核心:共识机制

    我在上一篇 区块链到底是怎么运行的 一文中 提到了 打包交易 和 广播交易 这两个概念 其实 以上谈到的两个内容正是区块链最核心的技术内容之一 共识机制 在今天的文章中 我们就展开聊一聊区块链共识机制到底是什么 以及区块链的共识过程到底是怎
  • 几种排序算法比较

    前言 排序是按照关键字的非递减或非递增顺序对一组记录重新进行排列的操作 是对无规律的一组序列转化为递增或递减的操作 排序的稳定性 当排序记录中的关键字都部相同时 则任何一个记录的无序序列经过排序后得到的结果都唯一 反之 若存在两个或多个关键
  • 如何进行测试微服务?

    在许多方面 测试微服务应用程序与测试使用任何其他体系结构构建的应用程序没有什么不同 微服务面临的独特挑战是组成应用程序的服务数量之多 以及服务之间的依赖关系数量 作为用于构建复杂系统的体系结构 微服务在开发社区中获得了巨大的关注 尽管人们开
  • 论文理解【IL - IRL】 —— Deep Reinforcement Learning from Human Preferences

    标题 Deep Reinforcement Learning from Human Preferences 文章链接 Deep Reinforcement Learning from Human Preferences blogpost L
  • 基于A*算法自动引导车的路径规划(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 动汽车动力系统复杂 行驶工况多变 能耗管理是其研
  • ajax aftersuccess,Ajax jquery success scope

    问题 I have this ajax call to a doop php function doop var old this siblings old html var new this siblings new val ajax u
  • Java 的 Class 文件格式——解析魔数和版本号

    解析 Java 的 Class 文件格式 解析魔数和版本号 作者 陈跃峰 出自 http blog csdn net mailbomb 熟悉 Java 语言有好几年了 技术也学了一些 现在主要从事 J2ME 技术方面的工作 最近工作不是很忙
  • 小学老师工资多少一个月_教师一个月工资是多少? 全国各地教师工资一览

    教师 被誉为人类灵魂的工程师 一直以来教师工资改革都是民生很关注的问题 据获悉 目前中小学教师基本工资都将得到相应的提高 那么 教师一个月工资是多少呢 下面我们来看看全国各地教师工资一览表 教师一个月工资是多少 教师一个月工资是多少呢 全国
  • Python究竟是个啥?为什么985的学生都在学它?早就该曝光了

    现在网上一搜学Python能做什么 无一例外地全跳出来一堆的专业名词 看的时候虎躯一震 看完之后 依然不知道学会了能干啥 不知道大家是不是也有同样的感受 为了解决大家这种困惑 我今天特意花时间总结了一些学完Python能做的工作 力求用最通
  • 【算法】希尔排序C语言实现

    上一篇文章我们一起学习了直接插入排序 它的原理就是把前i个长度的序列变成有序序列 然后循环迭代 直至整个序列都变为有序的 但是说来说去它还是一个时间复杂度为 n 2 的算法 难道就不能再进一步把时间复杂度降低一阶么 可能有很多同学说快速排序
  • linux笔记-awk详解

    简介 awk是一个强大的文本分析工具 相对于grep的查找 sed的编辑 awk在其对数据分析并生成报告时 显得尤为强大 简单来说awk就是把文件逐行的读入 以空格为默认分隔符将每行切片 切开的部分再进行各种分析处理 awk有3个不同版本
  • 以太坊蜜罐智能合约分析

    0 00 前言 在学习区块链相关知识的过程中 拜读过一篇很好的文章 The phenomenon of smart contract honeypots 作者详细分析了他遇到的三种蜜罐智能合约 并将相关智能合约整理收集到Github项目sm
  • 0402自学web后端之——使用flask-mail发送邮件

    安装 gt gt gt pip3 install flask mail 设置环境变量 gt gt gt export MAIL USERNAME 发件邮箱地址 163 com gt gt gt export MAIL PASSWORD 发件
  • java项目利用launch4j生成可执行exe文件

    一 项目结构说明 参见文章 java项目打成可运行jar包 http mp blog csdn net postedit 79194671 二 操作流程 1 右键项目 gt export gt Runnable JAR File gt Ne
  • Nginx【反向代理负载均衡动静分离】--下

    Nginx 反向代理负载均衡动静分离 下 Nginx 工作机制 参数设置 master worker 机制 示意图 图解 一个master 管理多个worker 一说master worker 机制 争抢机制示意图 图解 一个master
  • 获取时间/时间戳,并比大小

    获取当前时间戳的几种方法 1 System currentTimeMillis 2 Calendar getInstance getTimeInMillis 3 new Date getTime 注 上面的获取时间戳值都是毫秒级的 返回的都
  • 微信公众号发送模板信息报错——invalid credential, access_token is invalid or not latest hints:

    这个大部分原因是access token不正确导致的 这个access token是微信开放文档 公众号 开始开发 获取Access Token下的获取access token获取的 而不是下面的微信网页开发 网页授权中获取access t
  • 等概率抽样——水塘抽样

    等概率抽样 水塘抽样 给出一个数据流 这个数据流的长度很大或者未知 并且对该数据流中数据只能访问一次 且不能使用额外的空间 请写出一个随机选择算法 使得数据流中所有数据被选中的概率相等 从头开始遍历数据 当遍历到第n个数据时 从0到n 1中
  • 使用Wireshark与Burp Suite分析HTTPS协议

    目录 目的 内容 器材 设备 元器件 步骤 1 虚拟机服务器搭建网站 本机访问用Burp Suite抓包获取头信息 2 Wireshark和Burp Suite处理HTTPS的过程与技术实现过程原理 1 Wireshark 2 Burp S