使用 base91 生成安全密码。
大家好,我是无能。
最近,Chromium/Chrome 自动创建密码的功能让我感到非常不安,所以我想创建一个既简单又在一定程度上可逆的密码。
顺便说一下,在 Artix Linux 中,base91 命令不是默认安装的,所以这里假设你已经运行了 yay -S base91。
从结论说起
最终我决定用这个方法来生成密码。
echo -n "string" | sha384sum | awk '{print $1}' | xxd -r -p | base91 | tr -d "\n" && echo
※后来我想,可能 awk '{printf $1}' 更好。
闲聊
老实说,我以前经常使用 sha*sum 生成的字符串,字符数方面还算满意,而且哈希值本身是不可逆的,所以即使被泄露了也没什么大不了的。
但哈希化本身只是将字符串转换为十六进制形式,如果遇到真正的暴力破解,从字符串类型来看,正则表达式将是 [a-z0-9]。
而且现在都要求使用大写字母和符号,我却还在用这种方式,真是太糟糕了。
所以这次,我想方设法增加这种字符串的模式数量。
这次的方法会怎样
首先,我们来分解一下
echo -n "string"
将字符串无换行地输出到标准输出,并通过管道传递给下一个命令。
sha384sum
将接收到的字符串用 SHA384 进行哈希。
awk '{print $1}'
接收到的字符串末尾有多余的 -,不需要,所以用 awk 进行格式化。
xxd -r -p
这也是我查了之后才知道的,它将十六进制字符串输出为二进制格式。
因此,它将接收到的字符串输出为二进制格式。
base91
将接收到的二进制数据用 base91 编码并输出。
tr -d "\n" && echo
因为 base91 会自动进行换行格式化处理,所以需要删除换行符;如果成功,为了方便复制粘贴,最后输出一个空行。
结果就像这样。
alleycat:[haturatu]:~/git/ckr/ckr$ echo -n "a" | sha384sum | awk '{print $1}' | xxd -r -p | base91 |tr -d "\n" && echo
"OS[fY@wwBqip+$db@5+g!yvk$jE3,M3F({qu]1(_dS2Or()Q:ZqyhOb&9Y
这只是我刚才想到的方法,所以实际中是否有许多表单能够接受这种密码尚不清楚。
不过,字符串长度是:
$ echo -n "a" | sha384sum | awk '{print $1}' | xxd -r -p | base91 |tr -d "\n" | wc -c
59
即使是再短的字符串,也能生成59个字符。
优点
首先,用 xxd -r -p 生成时,可以同时作为二进制数据保存。
所以,即使忘记了原始的 string,最坏情况下只要有二进制数据就能恢复。
从步骤上看:
sha384sum = 不可逆
xxd -r -p = 可逆
base91 = 可逆
就是这样的步骤。
更确切地说,它比原始密码短语更长,而且如果能尽早将原始密码短语不可逆化,不是更好吗?所以就成了这样。
而且,用这种方法生成后,即使是 saslauthdb 或用于二进制调试的 strings 命令也无法读取二进制数据。
这比持有纯文本数据要安全得多。
shasum 哈希化后的碰撞可能性非常低。
再将其二进制数据编码成 Base91 格式,所以这比我用自己不够用的脑子想出来的密码要好得多。
在 .bashrc 中添加函数
老实说,每次都输入这个简直是地狱般的体验,所以
函数名() {
echo -n "$1" | sha384sum | awk '{print $1}' | xxd -r -p | base91 |tr -d "\n" && echo
}
这样就可以通过 函数名 string 来生成密码了。
如果这样还能被破解,那感觉就像是“放弃做人吧”,不,是“放弃加密吧”...
此外,如果想增加服务器端处理的密码字符串长度,可以使用 sha512;如果想减少 bash 上可识别的字符串长度,可以使用 base64。
可以轻松地进行更改,并相应地修改函数,然后将其写入 .bashrc,对吧?