0%

遇到的问题

我想在数据库中存一个被转化为Base64字符串的SHA256哈希值,我在想要用什么类型的值来存储,是用Text还是char[n],这实际上和base64编码的长度有关,于是就查了下wiki。

编码原理

编码其实是基于一个64个数值的编码表(图源维基百科):
base64编码表

也就是说每一个base64字符能够表示6bit的内容(2的6次方为64),换句话说,每4个base64字符(4 * 6 = 24)可以表示3(3 * 8 = 24)字节的内容。

Read more »

首先到release页面下载cpp的release:

https://github.com/protocolbuffers/protobuf/releasesgithub.com

比如这种:

img

你可以手动下载后解压,或者:

1
2
3
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.14.0/protobuf-cpp-3.14.0.tar.gz
tar -zxvf protobuf-cpp-3.14.0.tar.gz
cd protobuf-cpp-3.14.0

检查依赖文件是否齐全:

1
autoreconf -f -i

否则后续make可能会出现这样的问题:

img

正常的流程是:

1
./configure --prefix=/usr/local/

但是由于我们没有sudo权限,一方面不能使用bash运行configure,一方面无法写/usr/local/,所以这两个地方都需要做修改:

在./configure前面加上sh,后面的路径换成自己有权限的路径:

1
sh ./configure --prefix=替换成一个你拥有权限的目录

然后是:

1
2
3
make
make check
make install

即可等待安装完成,其中make和make check耗时较长,如果不愿意等,可以跳过make check 过程。

考虑到我们是在自己指定的目录下安装的,可能该目录没有被添加到本用户的环境变量下,因此可以:

1
vim ~/.bash_profile

然后把目录路径添加到PATH的最后面:

img

当初我弄到这里以为大功告成了,其实后面还有一大堆坑等着我,如果你写了一个protobuf的测试程序用原生g++进行编译,还会遇到大量的问题。

简单的说,你最好把protobuf手动添加到g++寻找头文件的路径、寻找动态、静态链接库的路径,否则后续编译可能会出很多奇怪的问题。当然你也可以在编译时使用-I、-L的命令,也许可以不用设置这些东西:

(这些也是在~/.bash_profile文件中设置的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 环境变量,中间用冒号隔开
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:$HOME/protobuf_lib/bin
export PATH

# g++找头文件的路径
CPLUS_INCLUDE_PATH=$HOME/protobuf_lib/include
export CPLUS_INCLUDE_PATH

# 找动态链接库的路径
LD_LIBRARY_PATH=$HOME/protobuf_lib/lib:/usr/local/lib:$HOME/workspace/MouseDB/lib/protobuf/lib
export LD_LIBRARY_PATH

# 找静态链接库的路径
LIBRARY_PATH=$HOME/protobuf_lib/lib:/usr/local/lib:$HOME/workspace/MouseDB/lib/protobuf/lib
export LIBRARY_PATH

# 找pkg_config的路径
export PKG_CONFIG_PATH=$HOME/protobuf_lib/lib/pkgconfig

最后再重新生效一下即可:

1
source ~/.bash_profile

BTW,如果后续编译出现google::protobuf::之类undefined的问题,请务必再编译时添加

1
-lprotobuf -lpthread

两个参数,比如我的Makefile是这样的:

1
2
3
# proto测试
proto_test : test/test_proto/proto_test.cc
g++ -wall $^ -g -o test/test_proto/$@ -std=c++11 -lprotobuf -lpthread

本文地址: https://www.chimaoshu.top/CentOS下无sudo安装protobuf的过程/
版权声明:本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议,转载请注明出处。

浅析比特币中的数据结构

block chain

​ 从整体上看,block chain是由哈希指针连成的链表。如图所示,除了创世纪块以外,每一个区块都有指向上一个区块的哈希指针,同时最新产生的区块也会有一个哈希指针指向他,只是还未被记录到下一个区块中。

​ 值得一提的是,指向一个区块的哈希值由在此之前的所有区块共同作用。之所以说是“在此之前的所有区块共同作用”,是因为每个区块的block header都会存储上一个区块的哈希值,而计算区块的哈希值又需要整个block header的参与,上一个区块的哈希值自然包含在里面。

​ 因此,只要某一个区块发生了篡改,后续的所有区块的哈希值都需要进行相应的修改,才能使得哈希指针能够对上。这个数据结构的好处是,只要存储最后一个哈希指针,就能检测前面所有的区块是否被篡改过,这是区块链不可篡改性的基石。

block body

​ 顾名思义,block body是每一个区块的身体部分,它存储了由矿工打包的一些交易。整体上看,block body是由一课Merkle Tree构成的。

​ Merkle Tree,构成block body的数据结构。类似二叉树,但是这里的指针是哈希指针而非普通的指针。block body需要存储每一笔交易的具体内容,这些交易的具体内容都存储在Merkle Tree的叶子节点中。而每一个叶子节点都会生成哈希,兄弟节点之间的哈希会再进行一次哈希,生成父节点的值,以此类推,最终生成一个根哈希值(root hash),存储在block header中。

​ 这种数据结构有什么好处呢?首先,我们只要存储一个root hash就能判断每一笔交易(即叶子节点)是否被篡改,这并不难理解。

​ 其次,我们可以进行所谓的Merkle Proof,即证明某一笔交易是否被写到区块链中。在比特币这个去中心化的世界中,每个设备都是一个节点。挖矿的矿工属于全节点,他们的设备上存储了从创世纪块到现在的所有区块的block header与block body。而比特币钱包属于轻节点,与全节点不同的是,轻节点只存储block header,而不存储block body。前面说到,root hash会存储在block header里面,因此轻节点拥有root hash的内容。当你使用比特币钱包做了一次转账,轻节点(比特币钱包)需要检查转账是否被写在区块链里面,那么钱包会向全节点发起一次请求,由全节点返回对应路径上的哈希(如上图所示,如果想要检查a交易是否被写到区块里面,那么全节点会返回H(b)与H(H(c), H(d))),这样轻节点就可以在O(logN)的时间复杂度内算出root hash,检查其与本地存储的block header里面存储的信息是否一致,如果一致,则证明交易已经被存储到区块中。

block header

block header里面并没有亮眼的数据结构,但它存储的信息仍然十分重要,我们不妨看看:

这是来自https://www.blockchain.com/btc/block的区块链信息,是7分钟前刚被矿工挖到的一个区块。可以看到里面存储了很多信息,比如我们前面提到的,整个区块链的哈希,以及Merkle root的哈希,还有出块的时间、挖矿得到的比特币奖励、矿工小费、协议版本等信息。

本文地址: https://www.chimaoshu.top/浅析比特币中的数据结构/
版权声明:本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议,转载请注明出处。

绕过微信证书检验

微信APP内置了对自家证书的校检,因此抓包时,微信会因为检测到自签名证书而拒绝联网。而Xposed能使用hook的方式来绕过它。

其中VirtualXposed是一个免root的不错选择:

https://github.com/android-hacker/VirtualXposedgithub.com

在项目的release页面可找到APK。

再使用VirtualXposed安装JustTrustMe插件:

https://github.com/Fuzion24/JustTrustMegithub.com

在项目的release页面可找到APK,在安装APK时需选择“在VirtualXposed中安装”。

需要注意的时,VirtualXposed中的插件只会对VirtualXposed中的软件起作用,因此需要在VirtualXposed中也安装微信APP,建议到微信官网寻找32位的微信APP,不要使用64位APP或者使用应用商城的APK进行安装,否则很可能安装失败。

同样的,下载微信的APK后,选择“在VIrtualXposed中安装”即可。

使用Burp进行抓包

需要从电脑中把burp的证书导出并安装到手机里面:

在burp里面选择导出证书(export certificate),然后修改后缀为.cer,传给手机后,选择证书,点击安装,随便勾选用途即可。

img

再次之后,打开手机的wifi–更多设置–开启代理,填你电脑的内网ip(要求手机和电脑在同一局域网)以及burp的监听端口就可以了。

img

先开启burp的监听,然后开启VitualXposed中的微信即可开始对微信进行抓包。

无论是获取微信内置浏览器的cookies,或者对微信小程序进行测试,都可以采用此方法。

本文地址: https://www.chimaoshu.top/VirtualXposed-Burp对微信抓包思路/
版权声明:本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议,转载请注明出处。

STL中红黑树的用法探究及使用红黑树进行多字段索引的方法

前言

最近在造轮子,需要造分析型数据库。在关于热数据的设计中,对于到来的每一条热数据,我需要使用红黑树来维持热数据在内存中的有序索引。后来使用了STL中的红黑树,这个过程遇到了一大堆坑,网上能找到的资料又很少,所以记录了一下。

问题

我需要维护多个字段的索引,比如这么一张图,我需要在红黑树上维护对于b、c、d三个字段的索引:

图源https://www.zhihu.com/question/304037770/answer/1287557228

上图出自知乎问题mysql联合索引的B+树到底张什么样子啊?下@Limit的一个回答,这是innodb引擎下使用B+树的解决方法。但由于我现在维护的是热数据,并不需要进行磁盘IO,且只需要支持查询和插入的操作,所以我需要用红黑树来解决此问题。

Read more »

使用DDNS解析脚本对阿里云提供的域名进行动态解析

前言

之前用bitwarden_rs的docker容器+Nginx反向代理,并设置了https,把bitwarden服务器部署到了自己的电脑上,在校园网中提供服务–只要我的手机连上学校的wifi,就可以访问到我电脑上的bitwarden服务、

https://zhuanlan.zhihu.com/p/158794535

但是我遇到了一个麻烦的问题,就是电脑在校园网的ip偶尔会发生变化,每次变化就要手动登陆阿里云去修改DNS的解析ip地址,这很麻烦。所以我决定使用DDNS来完成解析ip的动态切换。

Read more »

波兰式,逆波兰式

某校数据结构课一道OJ题

题目描述

表达式有三种表示方法,分别为:

前缀表示(波兰式):运算符+操作数1+操作数2

中缀表示:操作数1+运算符+操作数2

Read more »

遇到的问题

阿里云的学生机,10块钱一个月的那种,只有1Mbps的带宽。1Mbps是什么概念呢?就是公网下行带宽最大是1×1024÷8 = 128 kb/s,每秒最多128kb的速度,开mc服务器基本顶不住。一个只有三人的私人服务器,差不多两人就能把带宽占满,三人就开始卡,如何解决呢?

Read more »

最初的想法

从很久之前就一直想要找到1Password的替代品,当时自己用AES256 + RSA2048的加密方式,写一个服务端和客户端,只能在终端黑窗口里面运行,总归没有这些成熟的产品用得爽。后来了解到了Bitwarden,想部署到服务器上,想了想不如部署到本机上吧,不然服务器一到期就一直得续费。原版的Bitwarden服务端的服务对象是比较广的,资源消耗也比较大,总归不是办法。后来了解到Bitwarden_rs,是大佬用Rust重新写的一个不那么耗费资源的版本,就决定是它了。

Read more »