openssl encrypt and decrypt large file
人活得还好好的
TODO
背景
过去几年,听闻好多个30多岁的程序员大佬突然离去,虽然现在工作环境已经很安逸,但是考虑到过去几年透支的身体,还是感觉要定时回顾一下自己的一生,留下点自己的感悟和遗言。
遗言嘛,能说实话还是说实话,但是为了避免人还活着,但已经社死,考虑结合加密算法和github action来定时检测自己是否活着,如果自己的github超过一段时间没有更新,就把遗言解密用邮件发给家人吧。
实现思路
一步步的实现,后续慢慢补充吧
- 非对称机密日常遗言
- 推送github repo
- Github actions 心跳检测是否存活
- 超时解密发送亲朋好友
技术细节探究
非对称加密
非对称加密的优势就是加密时使用公钥,解密时可以使用私钥,二者可以分开保存,安全性更高。
密钥默认就有ssh-keygen 生成的密钥对吧,方便日常书写,也方便Repo推送, 工具就使用openssl吧,后期结合git hooks,用python实现一个自动化的工具,避免把未加密的遗言推送到repo过早社死
转换SSH KEY
因为SSH KEY默认已经是SSH2-formated,无法直接被openssl直接识别,需要转换成格式
私钥转换
1 | ssh-keygen -p -m PKCS8 -f ssh/id_rsa |
公钥转换
1 | ssh-keygen -e -f ssh/id_rsa.pub -m PKCS8 > id_rsa.pub.pkcs8 |
后续使用openssl时,使用的公钥就是id_rsa.pub.pkcs8
加解密小文件
对于普通小文件,可以直接使用openssl加密
1 | #enc |
加解密大文件
对于大文件,一般不适用公私钥直接进行加解密,实现流程如下:
- 加密 => 生成随机密码文件
- 加密 => 使用公钥加密随机密码文件
- 加密 => 使用随机密码文件加密目标文件
- ========== 按需求保存或者发送加密后的随机密码和加密后的目标文件
- 解密 <= 使用私钥解密加密后的随机密码文件,还原出密码
- 解密 <= 使用密码文件还原目标文件
生成随机密码文件
1 | openssl rand -base64 256 > key.bin |
加密密码文件
1 | openssl pkeyutl -encrypt -pubin -inkey ${PUBKEY} -in ${RAND_KEY} -out ${RAND_KEY_ENC} |
使用密码文件加密目标文件
1 | openssl enc -aes-256-cbc -salt -pbkdf2 -in ${ORI_IN} -out ${ENC_OUT} -pass file:${RAND_KEY} |
解密加密后的密码文件
1 | openssl pkeyutl -decrypt -inkey ${SSH_KEY} -in ${RAND_KEY_ENC} -out ${RAND_KEY_DEC} |
使用密码文件恢复加密后的目标文件
1 | openssl enc -d -aes-256-cbc -pbkdf2 -in ${ENC_OUT} -out ${DEC_OUT} -pass file:${RAND_KEY_DEC} |
Show me the whole shit
1 |
|
Github actions 支持
调用repo secret解密
可以将私钥保存到github repo的secret环境中,在github action调用私钥解密即可,就可以对文本进行解密
通过email发送解密后的文件
full code
on the way