毕业三年记

今天收到了HR助手推送的入职贺卡,不知不觉已经毕业三年了。

和所有的怀旧一样,三年时间,说起来不长也不短。赶上中午午休用文字的方式和大家闲聊两句,也记录下现在的状态,毕业四年的生活再来做append。

1. 这三年过得怎么样?

如果满分是10分的话这三年我只能给7分,这三年我的状态并没有调整到非常好,甚至不如我在交大时候工作的状态。

交大时候的工作状态我可以给自己8分,那种忘我的、全身心投入、不顾得失的工作状态,让我非常想念。

在这三年里每年都有不一样的感悟,有些感悟当时没记下来,感觉很是遗憾。趁着现在还有点印象,抓紧记录下来。

毕业第一年我感觉是生活在象牙塔里的。在公司踏实干活,发了工资之后踏实花钱然后月光。和女友也处在异地的状态,每次见面都感觉像是最后一次见面,爱情的花花绽放在2018~2019年的深圳的蓝天上。

19年年中我来到北京找张美丽,月光的危害开始显现。通过贷款才把压一付二加一个月中介费共三万块钱交上。因为在中关村上班而且公司不管午饭,经济上压力十分之大。温室里栽培的花朵终于受到北京物价的毒打,结束了在深圳一周一蹦迪、周周下馆子的生活。彼时还想着在20年的结婚的事情,背着一屁股债,还得想着要怎么才能解决彩礼的问题。

20年疫情袭来。压力更大了。20年上半年在家办公了一段时间。用英文来讲叫WFH。在家办公人都快抑郁了。在家办公需要自己做饭,需要自己掌握工作的节奏,以及到了晚上十点会忽然想到一个主意然后忍不住想打开电脑来做一些验证。以后再也不想WFH了,WFH并不好玩。以及20年还清了19年欠的钱,生活压力比之前小了一些。

时间到了21年,21年我觉得压力比20年小一些,但仍然有很多挑战。

2. 这三年有啥收获?

毕业第一年活在象牙塔里,现在一想压力小的时候成长也小。没有什么可总结的…

毕业第二年压力很大,为了排解这个压力我读了一些佛法的书。宗教排解了一些我的烦恼。

毕业两年半的时候我开始运动,原因是身体开始不健康,抵抗力直线下降。

3. 说点好的吧!

  1. 和张美丽在一起是一件非常开心的事情!我们一起度过了一段非常有趣的日子,之后我们组建了一个(现在看起来是)很幸福的小家庭。三年来张美丽包容了我N多的小毛病(这些小毛病背后有一颗火热的爱她的❤️),这三年犯了一些单拎出来都致命错误,张美丽包容了我。
  2. 好朋友是非常难得、需要珍惜的人!(感谢来参加我婚礼的每一个人!谢谢你们!)
  3. 钱是一个好东西,但是快乐和钱关系不大。¥1000的酒和¥100的酒、¥1000的日料和¥100的烤串 等等给人带来的快乐我觉得没有太多区别。
  4. 要成为一个有理想、有志气、有抱负的年轻人。理想、志气和抱负不应该和钱搭上关系。
  5. 平台很重要,能在腾讯工作也是一件非常幸运的事情!
  6. 时间很宝贵,巴菲特有很多钱,但是他已经老了(而我才23岁),我们不要浪费时间。大部分的不能带给人成长的事情都是在浪费时间。
  7. 健康很重要,健康的身体是一切一切一切的基础,我们都要成为健康的人。
  8. 有一个打牌的理论:“人生像一场牌局,每个决策可能都影响未来手里的牌,多多学习多多思考,勇敢地出牌,持续的局部最优解会导向全局最优解。如果一直不出牌的话人生就不好玩了。”
  9. 文明的发展需要时间。年轻人的发展也需要时间,很多事情急不得,我们一起认真打牌。
  10. “今我所说,皆为非法,皆不可说,皆不可取” – 这个是佛祖的话。生活有很多法门,每个法门都指向通向真理的道路。上面瞎聊了一些我的想法,给大家介绍一下我找法门的历程。

4. 人生路很长,我们一起加油💪

橘子洲头的夕阳

那些一起写过的代码 – 7年编码环境变化记

我是一个IT行业工作者,从大一开始写代码到现在已经快7年了,找了一些编程环境的老照片,和大家分享一下我的成长历程。

(为了避免给大家造成麻烦,本文不提及任何人名。)

2014年 – 宿舍编码

我就读于山东大学计算机学院,可能是因为学校和政府的一些校区租赁关系,我们学校大门一直是“山东大学齐鲁软件学院”,这给市民朋友和我们同学们都造成了很多诸如 “齐鲁软件学院到底是个三本还是个专科”这样的疑惑。

现在回想起来,软件园的学习环境十分一般,大一刚入学的时候还有文史哲的妹子们在这,后来就全部搬到中心校区了,让本来就没太有生机的校园变得更加缺乏活力。文史哲的妹子们走了之后就只剩下计算机学院、软件学院和新成立的一个微电子学院… 一听这些名字就感觉真是苦哈哈,一群大老爷们天天摆弄电子仪器,咔咔咔写代码的即视感。

大学住的是六人宿舍,条件十分有限,三个人共用一张桌子,我在宿舍写了有大约两年的代码。刚入学时候写的是Java,后来感觉C语言更帅,以及有一个做Linux底层研发的表哥感染了我,于是哼哧哼哧开始写Linux下的C语言编程。

下面这张照片拍摄于我大一的时候,彼时我用的是i3、4GB内存的联想G410笔记本,旁边的代码书应该是Java入门到精通一类的书。天天在床上哼哧哼哧,乐此不疲。

摄影师 – 睡我对面的x同学

写了一年代码之后,我开始面试XX实验室,比如当时的嵌入式实验室,我觉得非常厉害。有学长带,能和一群人一起写点有用的代码,以及找到一个团体能够接收我,更重要的是,当时学校给实验室分配了单独的教室,加入实验室就可以在4区的一个房间里有个自己的卡座,天天在床上写代码可不是个可持续发展的事情….

可能实验室的位置比较稀缺,没有实验室给我发offer…

2016~2017 学院实验室编码

后来机缘巧合接触到了安全行业,在大二参加了几个学长组织的网络安全的线下讨论会,以及找学校网站疯狂试手时候,学院一个做安全的老师老师向我抛出橄榄枝,我搬着我的笔记本开始在科研楼写代码。

实验室的办公环境

科研楼工作环境非常棒,有24*7的空调,有免费热水,有服务器资源。和实验楼也非常近,我在这里度过了一段十分快乐、非常存粹的时光。

在实验室度过了一年的快乐时光,转瞬到了大三下学期。到了大三下学期就面临着要考研还是找工作这样的选择。我复习了一个月,看完了高数一。然后痛改前非,发现自己实在不是考研的料:真的实在是太枯燥了。

2017~2018 上海交大网络信息中心

刚好机缘巧合,上海的一个老师向我抛出橄榄枝,给了我一个去交大实习的机会,于是在17年暑假我启程前往上海,开始在交大哼哧哼哧写代码…

交大的办公环境摄影

在交大的日子也十分快乐,在交大的生活像个乌托邦。感觉每天都在做自己喜欢的事情。以及有各种各样的漂亮小姑娘、有吃不完的食堂,学校环境非常非常好。类似于这样子的。我对交大的情感非常丰富,在这里不说太多了。

2018~至今 腾讯科技

大学毕业离开交大后,我到了腾讯就职,赶上腾讯930变革前夕入职腾讯,做安全研究相关的工作。腾讯办公环境也不错,关键是,someone pay for my code! 有人为我的代码买单了!

2018 ~ 2019

深圳大族的工作环境

2019~2021

家中的办公环境
北京新大厦的工作环境

最后

谨以这个小水文:

纪念逝去的时光

幸福生活来之不易,要过好现在的每一天。

感谢每一个帮助过我的人,感谢看文章的你。

未来很长,我们一起加油💪

惊呆,使用john+GPU 破解pfx密钥,竟然可以这么快!

众所周知,GPU的计算能力在某些特定场景对比CPU会有数量级的差异。 在密码破解这块更是如此。

john是一个开源的离线密码解密工具,合理利用gpu算力可以大幅度加快爆破速度。官方支持通过opencl进行爆破解密。

pfx 是一种密码归档文件,一般用来存放 证书链、私钥等内容。我们的爆破主要是爆破私钥的密文。

硬件配置

在云计算的时代,我们自然优先考虑云上算力,随用随开,用完即走,而且配合使用竞价实例,物美价廉。

如下图所示,40C160G 2NVIDIA T4的机器,只要不到¥5.5/h,堪称网吧级定价,超算级享受。

john安装

购买完CVM,使用ssh登录后,可以看到贴心的腾讯云已经为我们安装好了Nvidia驱动和CUDA加速包。

使用 nvidia-smi指令可以查看硬件信息,我购置的是 1/4 T4显卡的机型。

ubuntu@VM-1-3-ubuntu:~/john/src$ nvidia-smi
Fri Jun 11 15:17:26 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GRID T4-4C          On   | 00000000:00:08.0 Off |                    0 |
| N/A   N/A    P0    N/A /  N/A |    560MiB /  4096MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

因为john放弃掉了cuda的支持,采用了opencl进行加速,安装一下 opencl的开发包

sudo apt install ocl-icd-opencl-dev

接下来配置john

git clone https://hub.fastgit.org/openwall/john.git && cd ~/john/src/ && ./configure

不出意外的话可以看到OpenCL support ............................. yes,如果没有这个值的话则说明环境存在问题

image-20210611153819294

接下来 执行 make -j 4 && make install 就好了

安装完成之后,在 src 的同级目录可以看到 run文件夹

cd ../ && ./run/john

破解pfx密钥

下载测试pfx文件,先使用指令安装python依赖

sudo apt install python3-pip && pip3 install --user asn1crypto

执行 python3 run/pfx2john.py ./server.pfx > server.hash 将pfx文件转成john可识别的格式。

这个 pfx2john的脚本也很简单,把pfx密钥的加密格式、salt值等提取出来,用固定格式输出。

def parse_pkcs12(filename):
    data = open(filename, "rb").read()
    pfx = pkcs12.Pfx.load(data)

    auth_safe = pfx['auth_safe']
    if auth_safe['content_type'].native != 'data':
        raise ValueError(
            '''
            Only password-protected PKCS12 files are currently supported
            '''
        )

    mac_data = pfx['mac_data']
    if mac_data:
        mac_algo = mac_data['mac']['digest_algorithm']['algorithm'].native
        key_length = {
            'sha1': 20,
            'sha224': 28,
            'sha256': 32,
            'sha384': 48,
            'sha512': 64,
            'sha512_224': 28,
            'sha512_256': 32,
        }[mac_algo]

        salt = mac_data['mac_salt'].native
        iterations = mac_data['iterations'].native
        mac_algo_numeric = -1
        if mac_algo == "sha1":
            mac_algo_numeric = 1
        elif mac_algo == "sha224":
            mac_algo_numeric = 224
        elif mac_algo == "sha256":
            mac_algo_numeric = 256
        elif mac_algo == "sha384":
            mac_algo_numeric = 384
        elif mac_algo == "sha512":
            mac_algo_numeric = 512
        else:
            sys.stderr.write("mac_algo %s is not supported yet!\n" % mac_algo)
            return
        stored_hmac = mac_data['mac']['digest'].native
        data = auth_safe['content'].contents
        size = len(salt)
        sys.stdout.write("%s:$pfxng$%s$%s$%s$%s$%s$%s$%s:::::%s\n" %
                         (os.path.basename(filename), mac_algo_numeric,
                          key_length, iterations, size, binascii.hexlify(salt).decode(),
                          binascii.hexlify(data).decode(),
                          binascii.hexlify(stored_hmac).decode(), filename))

下载密码包

wget https://github.com/danielmiessler/SecLists/raw/master/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt

接下来使用john进行破解

ubuntu@VM-1-3-ubuntu:~/john$ ./run/john ./server.hash --format=pfx-opencl --wordlist=./10-million-password-list-top-1000000.txt
Device 1: GRID T4-4C
Using default input encoding: UTF-8
Loaded 1 password hash (pfx-opencl, (.pfx, .p12) [PKCS#12 PBE (SHA1/SHA-256/512) OpenCL])
Cost 1 (iteration count) is 2048 for all loaded hashes
Cost 2 (mac-type [1:SHA1 256:SHA256 512:SHA512]) is 1 for all loaded hashes
LWS=128 GWS=10240 (80 blocks)
Press 'q' or Ctrl-C to abort, almost any other key for status
123456789        (server.pfx)
1g 0:00:00:06 DONE (2021-06-11 16:04) 0.1594g/s 1633p/s 1633c/s 1633C/s 123456..jesus123
Use the "--show" option to display all of the cracked passwords reliably
Session completed

可以看到,已经爆破成功啦~ 使用openssl工具可以查看信息

ubuntu@VM-1-3-ubuntu:~/john$ openssl pkcs12 -info -in ./server.pfx
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: 5C 5B 4B 74 27 F1 5F DF 23 9C D6 47 5B 67 B9 66 C8 7A 2C D6
subject=C = cn, OU = custer, O = custer, CN = localhost

issuer=C = cn, ST = shanghai, L = shanghai, O = cluster, OU = cluster, CN = localhost

参考链接

烦恼

我年轻的时候烦恼比较少,年轻的时候我觉得:没有什么是非做不可的,喜欢什么做什么就好了。

这种状态贯穿了我的整个大学生活。所有我大学挂了很多科,考研也只坚持了一个月,但是依旧乐此不疲,充满了生命力。

踏入社会快三年了,我感觉到烦恼又慢慢变多了。这个时候脑子里又冒出来一句话来:“钱多了,烦恼也就来了”。我现在感觉到我的烦恼都是一些看得见摸得着的东西。比如不知道怎么推近我的婚礼,不知道怎么开始邀请朋友,没有准备一场精心设计的求婚。。。等等等等

穷困潦倒的时候比较开心,赚了一点钱之后反而烦恼又多了。真是个复杂的世界…

这几天看到道哥在日更公众号,依稀我当年握住道哥的手:“道哥我以后要向你一样牛逼。”,道哥:“好的,你要加油。”。

要加油啊朋友们。

成都

今天加班上厕所时忽然听了一下《成都》这个歌。感觉生活少了很多诗意啊。

北方的村庄 住着一个南方的姑娘。(实际上:住在海淀区一个现代化小区里)

她总是穿着带花的裙子 站在路旁。 (实际上:北京最近很冷,空气也不好,屋里呆着吧还是)

她的话不多 但笑起来是那么平静优雅。(实际上:很久没关心过哪个姑娘笑起来是不是平静优雅了,老了老了。。。)

她柔弱的眼神了装的是什么 是思念的忧伤。(实际上:北漂要好好搬砖,天天思念天天忧伤,容易交不起房租。。)

除了关心张美丽、关心工作之外还要有点诗意才好啊。

站点迁移到hostinger.com

博客(Wordpress)在腾讯容器服务(k8s)上托管 了5个月之后,因为成本问题迁移到hostinger.com。

hostinger是一家专业的Wordpress托管商,近期有优惠活动,花费¥205一口气购买了四年的托管服务。这和一个月¥5不到,还是挺划算的。

之前使用的腾讯云的k8s成本过高,每个月需要花费大约¥200,会对钱包产生负担,暂时迁移走了。

除了Wordpress外,k8s平台还部署了一些蜜罐和靶场的服务

李志回归啦~

2019被封杀之后,2020年8月8日,李志在成都叁缺壹激情开唱,在开头说道:

“我在2018年的身体出了一点问题,后来我们决定要休息一下。过去一年多一直在调理身体,也在反省过去的一些事情,好的坏的。不过我现在的身体已经调理得很好了。我去医院又去体检了,医生说:“身体没问题,洞房都可以”。于是我就打起精神了,后面还有很多事情,但是希望大家配合我们。”

欢迎李志回来,这个世界会好的。

身体没问题,洞房都可以

理发店的小哥

到了理发店洗完头擦干坐下,过来一位和我年龄相仿的理发小哥,给我整好理发设备之后问道:“想剪什么样的头?”,我:“随便剪就行,剪个看起来帅一点的”。

理发小哥面露难色:“平时打理吗?”,我:“不打理,平时都太忙了,洗头发都够呛有时间。”

我在互联网行业上班,有些读者可能不知道,这个可能是当今社会加班最多的工种之一了,我想,这样和理发小哥说,应该可以理解了吧。

不曾想理发小哥面色严肃:“你就是不注意自己的形象,你这个发质不打理的话就是软塌塌的,帅不起来。”,我感觉有些尴尬:“嗨,这不是太忙了吗”。

不曾想理发小哥不仅不给我台阶下:“你平时又不打理,又想让我给你搞帅一点,我怎么搞嘛。对自己形象没追求,搞不了。”。

说完我们沉默了一分钟,我说:“那您就看着剪吧。”。小哥看了一下我,蹭蹭开剪。剪完之后抹上发胶,我一看,“嘿,还真不错!”。和之前进理发店生活简直判若两人,气质都有不同了。

然后我又想:“小哥其实说得对,虽然工作挺忙,但也没有忙到理个发、洗个头都没时间,整清爽一点自己舒服,别人看着也舒服,是得稍微打理下。”。

出门之后一想,这个发型怎么这么熟悉。又一想:

“嗨,原来是照着他的发型给我剪的?,我和理发小哥发型一样了。”

后来我成了理发店的常客,定期去理发店打理头发。

【最后】DHT告一段落

前面两个周末都在研究如何自动抓取、发现DHT网络中的内容,今天决定告一段落。

折腾成果:

实现了

  • 自动化发现每天的新增热门种子
  • 下载这些热门种子
  • 上传到GSuite,把文件存储下来

项目架构:

总结:

用了两个周末完成的这个事情,现在看起来:

没有任何意义

从P2P社区吸血、制造大量无用Traffic、滥用订阅的GSuite。不创造任何的价值。

在精力有限的情况下,要把时间花在有意义、有价值的事情上。下次周末投时间(人力)之前要问自己三个问题:

  1. 做这个有什么用?要花多长时间?投入产出比是否能够符合预期?
  2. 有更高优先级的事情可以做吗?
  3. 创造爱和快乐了吗?

【续集】看了一点DHT进阶的东西

这周末没有忍住,看了一点DHT进阶的东西。想出来一个无聊的主意:使用闲置的服务器,将DHT网络上的每日Top的热点种子下载下来保存到GoogleDrive中,做一个DHT Memory的项目。

类似这样的东西有

简单分下模块的话:

  1. 热门种子获取模块:通过定期抓取DHT网络中的数据,输出高热度的hash。
  2. 下载模块:接收待下载的hash,下载完成之后上传到GoogleDriver,之后删除本地文件。

热门种子获取

热门种子获取有两种方案:

  1. 自己抓取+热度分析。自动抓取可以使用之前说到过的 https://github.com/boramalper/magnetico,热度分析我写了一个小小的脚本 https://gist.github.com/imfht/71b5f27d78df5af8d68b2ca8976dca00
  2. 直接使用别人整理好的数据,比如 https://nyaa.si/提供的RSS服务

由于时间有限,1有点来不及,暂时没有做,使用2提供的RSS源简单过滤了下做种人数。

文件下载模块

文件下载我选用的是Aria2,实际上这个不是一个最优解,如果没有额外的脚本,Aria2无法做到自动上传文件到GoogleDriver。但是迫于时间有限,没有做更深入的研究了。

总结

如果想搬运DHT数据到GoogleDriver的话,可以:

  1. 直接用别人整理好的数据,直接走下载上传流程,可以省事很多。
  2. 换用一个支持下载临时目录和完成目录不同的网站,利用rclone挂载目录,也可以省事很多。

实现了一个非常beta的版本,基本流程都走通了,但是主要时间花在了如何使用dht-server获取用户做种数量上。

预计下周末来搞一个完整的版本。