jackson
参考资料https://blog.csdn.net/qq_41834086/article/details/111152470
序列化与反序列化实例实体类
12345678910111213141516171819202122package com.example.demo;public class Person { public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } String username; int age;}
...
encrypt
AES加密AES支持三种长度的密钥:128位、192位、256位,分别称之为AES128、AES192和AES256。
AES加密会把明文拆成一个一个的明文块,每个明文块128bit,如果最后一块长度不足128位,则默认使用缺失的字节数填充。接着对这些明文块分别加密,将加密结果拼接形成最终加密结果。
在加解密过程,每个明文块会作为4*4字节的矩阵进行处理
加密过程包括如下四步
AddRoundKey(轮密钥加)
矩阵中的每个字节都与该次轮密钥(round key)做异或运算
SubBytes(字节替代)
通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节
ShiftRows(行移位)
将矩阵中的每个横列进行循环式移位
MixColumns(列混淆)
为了充分混合矩阵中各个直行的操作,使用线性转换来混合每列的四个字节。
填充方式
不填充 NoPadding
不进行填充,要求明文必须位16个字节的整数倍。
长度填充 PKCS5Padding(默认)
填充的数据为16-最后一块字节数:相差长度
若明文为16个字节的整数倍,则填充16个字节的数据,其值都为16(16- ...
南京大学计算机科学实验
开发环境配置
非root用户使用sudo执行命令,需将其添加到sudo中,使用命令
123su -add username sudoexit
重启之后生效
在修改镜像的过程中,原教程操作为
1sudo echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stable main" > /etc/apt/sources.list
虽然使用了sudo,但仍然会报权限问题,经查找,得知该段指令会被分为两步运行,echo 会使用sudo执行,但 > 会使用非sudo身份。
第一种解决方案(避免使用su)
1sudo su -c "echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stable main" > /etc/apt/sources.list"
第二种(更安全)
1echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ stabl ...
https
参考资料HTTPS原理和TLS认证流程全解析 - 知乎 (zhihu.com)
TLS 1.0 至 1.3 握手流程详解 - en_oc - 博客园 (cnblogs.com)
HTTPS协议http协议是明文传输,内容容易被中间人拦截后获取,且中间人可伪装为服务器,向客户端发送伪装的响应。
https在http应用层和tcp传输层中间加了一层SSL安全层,整个加密过程都没有侵入原先的http协议,故对http协议进行了很好的兼容。
TLS/SSLTLS协议就是SSL协议,SSL在被网景公司(Netscape)开发出来后,SSL1.0未公布,2.0具有重大缺陷,96年发布3.0,在SSL3.0的下一个版本便是TLS1.0,在此之后迭代TLS1.0、1.1、1.2和1.3,目前应用最广泛的为TLS1.2。
TLS加密原理类似于TCP会通过握手来建立连接,TLS也会通过握手来交换一些必要的基础信息。
既然TLS是为了保证传输安全,那肯定要对传输的数据进行加密,加密的方式一般有对称加密和非对称加密。
对称加密加密和解密都用的同一个密钥,由于CS方式的特殊性,如果采用对称加密,则会存 ...
tcp
TCP三次握手ACK和ack
ACK:TCP协议中的一个标志位,标识是否对上一个包进行了确认操作
ack:32位确认号,等于上一个包的序列号seq+1
此外
SYN:同步标志位,用于建立会话连接
seq:32位序号,通过该序号确认发送的数据是有序的
步骤
第一次,客户端将SYN位置1,表示开始建立同步会话。产生一个随机数x作为序列号seq,保存至TCP报文首部的序列号字段中。知名客户端打算连接的端口,将该数据包发送给服务器端,接着客户端进入SYN_SENT状态,等待服务端的响应。
第二次,服务端接收到数据包,先检查SYN标志位,发现为1,得知客户端要建立链接。于是服务端构造数据包:将SYN位和ACK位都置为1,表示当前要建立同步连接且对上一个包进行了确认,将ack字段填充为x+1,接着随机产生一个随机数y填入seq字段,发送给客户端,服务器进入SYN_Rcvd状态。
第三次,客户端检查ack字段是否为x+1,若接收到了,则将ack字段置为y+1发送给服务端,服务端接收后检查ack字段为y+1则建立连接。此时客户端和服务端进入ESTABLISHED状态,开始传输数据。
...
深入理解计Java虚拟机
参考资料《深入理解Java虚拟机:第3版》
概述Java,91年诞生,95年发布
09年sun被oracle收购
运行时数据区
其中,方法区和堆是所有线程共享的数据区,虚拟机栈、本地方法栈、程序计数器为每份线程独有的。
程序计数器当前线程所执行的字节码的行号指针,由于线程切换后需要恢复执行环境,故每条线程都需要一个独立的程序计数器来保存执行位置,这样才能保证各条线程之间互不影响。
如果当前线程执行方法为本地(native)方法,则当前线程该计数器值为空
虚拟机栈Java虚拟机栈也是线程私有,描述Java方法执行的线程内存模型:每个方法执行时,Java虚拟机都会创建一个栈帧,该栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从被调用直至执行完毕的过程,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表中存储的编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型。在局部变量表中这些值会占用不同大小的变量槽,其中64位的long和doubl ...
深入理解计算机系统
资料CS:APP3e, Bryant and O’Hallaron (cmu.edu)
15-213/15-513 Introduction to Computer Systems (cmu.edu)
Kernighan The C Programming Language
Bits,Bytes,Integer
Byte = 8bits
二进制每四位可以转为一个十六进制
地址是由机器字长决定的,比如64位的机器表示地址是64位长=8字节
基于布尔运算来进行位运算
布尔运算
AND & 交
A&B = 1 when A和B都为1
Or | 并
A|B=1 when A和B至少有一个为1
Not ~ 补
~A=1 when A = 0
Exclusive-Or(Xor) | 对称差
A^B=1 when A和B值不同
非位运算:&&,||,!
0为假,非0为真,且有短路运算
位移操作
左移 x << y
高位丢失,低位补0
右移 x >&g ...
Java百科(八股文)
说点什么”八股文“为大众所知是一种明清时代的考试题目格式,一种为应试而生的文体。而 Java八股文之所以叫也叫八股文,很大原因是因为其同样是为了应试而生的。
从来以为技术性的岗位面试中,应当是交流彼此的开发思想,谈论各自学习方法以及问题解决能力等,但现如今的Java面试,自从Java八股文出现之后,便成为了招聘者与应聘者的题库,招聘者从其中挑选出问题,而应聘者不管真实能力如何,只需要熟背Java八股文,便可以获得一份不错的工作。招聘方迅速从庞大的应聘者群体中筛选需要的人才,应聘者也需要在短时间的交流中展现自己的能力,这也是招聘方与应聘者都无可奈何的一件事。
我从来喜欢的学习方法为:先使用,再学习。这是因为在使用的过程中,可以碰到各种问题,这个时候再去找相关资料阅读,会对这个点有很深的印象。而如果先学习的话,很多时候都会不明就里,即使记住了,也不知道这个概念会在哪里用到,过不了一周便会忘记。故如果是为了应试而去背诵Java八股文,里面的很多知识点就算记住了,其实也不会对开发能力有多少提升。
然而,如果Java八股文褪去其”应试“的这层外衣,其本质上是一本很不错的Java百科。并且在开发者 ...
sax
sax介绍sax与dom解析不同的是,他是自顶向下的,边扫描边解析,适用于大数据量的,只有读取需求的时候
使用我们使用的xml源数据为
1234567891011121314<Persons> <person> <id>14233222322323</id> <name>张三</name> <age>15</age> <isMen>true</isMen> </person> <person> <id>14233222322323</id> <name>李四</name> <age>15</age> <isMen>true</isMen> </person></Persons>
这里我们的需 ...
Vite
Vite用于搭建前端项目的脚手架
npm+vite相当于后端的maven
使用Vite创建项目1npm create vite
初次使用会提示下载vite依赖,输入y继续
输入工程名
选择依赖的框架
选择语法 JS or TS
下载依赖vite创建好工程后有package.json,但并没有下载依赖,npm i 下载package.json中的依赖
pathpath 模块主要用于生成绝对路径,这样可以在项目代码中使用相对路径别名来引用文件和目录。具体地,path.resolve 函数用于将相对路径解析为绝对路径。
下面是代码中 path 用法的详细解释:
123456789import path from "path";// ... 其他代码 ...resolve: { alias: { '@': path.resolve(__dirname, './src') }}
**import path from "path";**:这行代码从 Node. ...