所有符号系统都可作为密码。
——杨义先《密码简史》
文章痕迹
2022
8-23
产生想法,书写于笔记本上
10-24 21:46:17
【V0.5】初步电子化,形成了大体框架
12-20 21:10
【V0.6】开始主体内容的写作
2023
2-10 19:07
【V0.7】读了一些书籍,系统化地粗浅地学习了密码学
3-13 16:07
【V0.99】完善内容,大体填充了【V0.5】留下的骨架
楔子
今天(2022-10-24)把浏览器从谷歌迁移到的微软的Edge浏览器,在迁移密码的过程中,发现我总共300多个账号,却只用了9个密码。甚是惊讶。刚好想起来了上上个月写的半篇文章,现在把它补全电子化,贴到博客上。
为了防止歧路亡羊,建议看到一个觉得很适合自己的方法,就立马停止阅读此文,开始自己设计。
引言
现在(二十一世纪二十年代)很多媒体都在强调个人信息的重要性,强调密码的强度要高,提示说不要使用身份证、生日等容易破解的密码。但却并没有人教我们怎样设计一套自己的密码。
一直以来,人们都在最容易破解的密码之中徘徊。笔者曾经也是如此,四年级第一次去网吧申请的4399账号时随便打的718293
竟一度成了后来的支付密码,手机号,姓名拼写等也都无脑的用来用去。可能是幸存者偏差的原因,所有的账户竟然一直没有被盗过号,也一直安心的用着,没有构想更安全的密码。直到2019年高考报名时,班主任一再强调,“报名系统的密码要自己记住,强度要高,绝对不能让别人知道,以免别人篡改你的志愿”。对于这关乎一辈子命运的大事,笔者当然十分上心了。当时高考报名系统的密码要求是8位以上,包含大小写、数字以及符号,笔者一看,平常的垃圾密码肯定是用不成了,便苦思冥想了好几天,终于在复习化学时候,从元素周期表中找到了灵感——利用化学元素与名字的谐音(具体见下文)。当时设计完那个密码,真是提笔而立,为之踌躇满志,庖丁解牛后的感觉也大概是那样了。从那之后,慢慢掌握了一些密码设计的诀窍,逐渐地形成了一个个小窍门,而后这一系列的感兴终于在2022年末形成了文字。
密码的基本要求
本文主要是为了帮助普通人设计一套自己的密码体系,来更好、更方便地生活。本文所指代的密码就是一般的账户密码,而其他譬如凯撒密码、恩尼格码(摁你个妈)机、洛伦兹机、量子加密等加密体系由于极其难认,故此类密码学中的加密方法并不在本文的主要讨论范围内。为避免歧义,笔者决定将这种较短的、常用的、私人性质的密码称为——密符。(灵感来自周朝姜子牙用自己的鱼竿制作的密码——阴符)
笔者认为,这样一套密码体系有应该有两个最基本特点:强私人性与易记性。私人性是首当其冲考虑的,因为每个人的经历不可能完全相同,不具有可重复性。哪怕你偶然读来一句诗,心念一动,根据物理上的平行宇宙假说,你就是进入了另一个平行宇宙了。可以说每个不经意的决定,每次环境潜移默化的影响,最终都成就了个体本身。生命看似是一条线,其实是万万条路中的一条,而这路上你独享的风景就是密符的重要来源。其次,密码应当具备良好的易记性。其实设计密符就跟写诗一样,一句好的诗只消一瞥就永生难忘,一个好的密符亦是如此,设计完一看就能记住应当是好密符的重要特点。
接下来本文就以密符的设计为主题,从几个方面进行探讨:
密符的类型
一般而言,人们通常会遇到如下几类密符
- 6位数字的支付密码、开机密码(亦即PIN)
- 8位字符以上的字母、数字、符号组合密码(不做细分)
- 9X9的手势密码
- 指纹、人脸、瞳孔、声音等生物密码
- 其他各种花哨的密码(比如黑莓android系列内置的图案移位密码,好像Win10上曾经也有过)
第一类可以归为第二类,第四类由于其绝对的私人性,可以说几乎不存在泄露、遗忘的风险,在此笔者将着重讨论第二、三类密符的设计。首先笔者将从设计方法和应用2个方面对各类密符的设计进行探讨
设计方法
为了实现密符的强私人性,我们需要一个专有的信息来源。这个来源必须是与我们生活直接相关的,如此才能保证我们可以更快更持久地记住这个密码,也自然的具有更高的强度。具体如下:
个人相关
名字
因为现在的密码体系大多是英文。所以说,如果你有一个英文名的话最好不过,没有的话可以用拼音来代替。那么如何设计一个姓名相关的密码呢?下面以笔者的名字——田欣洋为例做个示范。
字 | 拼音 | 声调 | 笔画 |
---|---|---|---|
田 | tian | 二声 | 五笔 |
欣 | xin | 二声 | 八笔 |
洋 | yang | 二声 | 九笔 |
- 拼音直用:
TianXinYang
- 拼音➕笔画:
5Tian8Xin9Yang
- 拼音➕音调:
Tian2Xin2Yang2
依照个人习惯取音调更好 - 输入法转码
- 九键:
8426 946 9264
- 田:8426
- 欣:946
- 洋:9246
- 五笔:
LLLL RQWY IUDH
- 田:LLLL (田甲方框四车力)
- 欣:RQWY (斤,⺈,人,丶)
- 洋:IUDH(氵,丷,三,|)
- 九键:
- 形合:
OHRIY
- 田→O
- 欣→HR
- 洋→iY
- 意合:
filed love ocean
- 谐音:
tian si on
- 例子收集:
岳飞→ UFA
- 例子收集:
- 切音:
ti an xi yin yi ang
- 析字:
4shan -jin shui yang
- 田:四面山:4shan
- 欣:欠斤两:-jin(减斤)
- 洋:水边羊:shuiyang
日期
我们首先做一点映射,以方便后续的设计。公历没得说,因为太过于通行,格式也比较规范,不具有太高的保密性,就不对它操作了。那么就对农历、干支历映射一番,把干支、生肖、二十四节气映射为数字,(细分一点七十二候的映射也是不错的)
项目 | 天干 | 地支 | 属相 | emoji | 英文 |
---|---|---|---|---|---|
1 | 甲 | 子 | 鼠 | 🐀 | Rat |
2 | 乙 | 丑 | 牛 | 🐂 | Ox |
3 | 丙 | 寅 | 虎 | 🐅 | Tiger |
4 | 丁 | 卯 | 兔 | 🐇 | Rabbit |
5 | 戊 | 辰 | 龙 | 🐉 | Dragon |
6 | 己 | 巳 | 蛇 | 🐍 | Snake |
7 | 庚 | 午 | 马 | 🐎 | Horse |
8 | 辛 | 未 | 羊 | 🐏 | Sheep |
9 | 壬 | 申 | 猴 | 🐒 | Monkey |
10 | 癸 | 酉 | 鸡 | 🐓 | Rooster |
11 | — | 戌 | 狗 | 🐕 | Dog |
12 | — | 亥 | 猪 | 🐖 | Boar |
接下来以笔者出生那年的中秋节月出时间为例,为方便设计出来一个生辰六字密符,我们可以把天干第十位癸
映射为0
,把地支后三位酉 戌 亥
映射为0 1 2
。
项目 | 年 | 月 | 日 | 时 | 分 |
---|---|---|---|---|---|
公历 | 2001 | 10 | 1 | 17 | 57 |
农历 | 🐍蛇年 | 八 | 十五 | 酉时 | 四刻 |
干支 | 辛巳 | 丁酉 | 丁酉 | 己酉 | 秋分 |
干支映射 | 86 | 410 | 410 | 610 | 16 |
经过这番准备,我们就可以发散思维来设计密符了:
- 生辰八字:
86 410 410 610
- 生辰六字:
864040
- 农历:
Snake@815(10.4)
- 蛇年:
Snake
- 在/的/于:
@
- 八月十五:
815
- 当天:
( )
- 酉时四刻:
10.4
- 蛇年:
单这些映射组合起来就有很多种,对于时间的话还可以从月相、星图、太阳高度角、昼夜长短等方面做文章,不过由于这些并不能很好地体现易记性,在此就不在列举出来。中华传统天文博大精深,希望可以就此抛砖引玉,让大家可以设计出来更有中国特色的密符。
地址
地址类密符可以从地区的简称、地理位置(相对方位、地标景点等)来进行映射,接下来以笔者的家乡大美南阳为例:
原始项目 | 隐含映射 | 输出映射 |
---|---|---|
河南省 | 豫 | yu |
南阳市 | 宛 | Wan |
南 | 伏牛山以南 | South Mountain |
阳 | 汉水以北 | North River |
这样映射以后很容易就可以得到一个不错的密符:SMNR@YuWan
,含义是:山南水北的豫之宛。
但这样的映射还太简单,为了更具有私人性,再加上另一座笔者待过的城市乌鲁木齐来提高一下密符的强度地址密符:Sion@YuWan2XinU
,含义是:我Sion从南阳到新疆(Xin)乌鲁木齐(Urumqi)
经历
普通人的一生会经历什么?出生,入学,升学,升学,升学,...,工作,结婚,生子(入学,升学...),成就,变故,...,死亡
这些经历本身不单单是回首往事时的一句话,更是一首诗,用一辈子写下的诗篇。
- 年份➕经历:
01born 19daxue 23biye
- 独特经历:
2019love@qwyc
- 独特经历:
2021@Web 2022@web3 2023@ai
如此这般,不胜枚举。
专用领域
因为专用知识的缘故,这一部分可能比较偏小众,当然上过九年义务教育的基本都能看懂,不过没有太在意过而已。接下来,笔者就让诸位来在意在意那些身边极佳的密符原材料。
英文谐音
符号 | 意义 | 中文意义 |
---|---|---|
2 | to | 对;至于 |
4 | for | 对;因为;为了;由于 |
U | you | 你 |
Q | kill | 消灭 |
T | tea | 茶 |
V | way | 道路;方法 |
Y | why | 为什么; |
B | bee | 蜜蜂 |
EZ | easy | 轻松(来自EZFM) |
# | — | 代表特定主题 |
@ | at | 指定某个人或特定事物 |
& | and | 与;和 |
29 | tonight | 今夜 |
元素周期表
由于元素周期表有118个元素之多,可以说与许多汉字都有谐音,这个谐音就是密符的极好来源,除此之外元素周期表上的许多奇特性质都可以作为密码来使用,也很容易记忆。还以笔者的名字——田欣洋为例:
字 | 谐音元素 | 符号 | 原子序数 |
---|---|---|---|
田 | 钿 | Ts | 117 |
欣 | 锌 | Zn | 30 |
洋 | 氧 | O | 8 |
设计出来这样的密码谁能不欢喜呢。
计算机
计算机的指令本身代表了特定含义,比如网页中的404
表示:找不到等等,都可以在密码中表达出一定的含义。下面以部分Shell指令为例,来解读一下
指令 | 含义 |
---|---|
root | 根权限 |
admin | 管理员 |
#!/bin/bash | 用bash来执行命令 |
// | 注释 |
表情
字符表情也是一个很形象的来源,表情本身就有含义,在此不做过多解释。
表情甲列 | 表情乙列 | 表情丙列 |
---|---|---|
>_< |
^_^ |
;-) |
0_0 |
@_@ |
:) |
-_- |
^o^ |
:P |
'_' |
x_x |
:( |
O_O |
T^T |
:D |
音乐
音乐中的简谱、公尺谱也可以作为来源,
公尺谱 | 简谱 | 唱名 |
---|---|---|
上 | 1 | do |
尺 | 2 | re |
工 | 3 | mi |
凡 | 4 | fa |
六 | 5 | sol |
五 | 6 | la |
乙 | 7 | si |
亻上 | ˙1 | low do |
彳上 | 1˙ | high do |
再映射一些其他的乐理
项目 | 符号 |
---|---|
加八度 | +或 ^ |
减八度 | -或 _ |
停止符 | 0 |
节拍符 | . 或- |
此外还可以用MIDI的规范来把音符映射到字符上: 示例:
- 男儿当自强:
61+61+656.61+61+562+
- ザ☆ウルトラマン:
(333332343212)+6.(222212321)+71+
如果采用了这种映射来设计密码,那“输密码该多是一件美事!”
图案密码设计
这里头的水太深,在此奉上Zye博主发布的唯一条视频:What Is The Most Complicated Lock Pattern? - YouTube 就我个人而言,技巧是折回:从中间点开始先连下面点,再折回到上面点来制造出不能一笔画的假象,如果还要说些什么的话,那就是:不要过于复杂,图案规律尽量有重复性,不对称性(不对称的安全性更高点)
应用体系
在了解了诸多的来源之后,我们便可以一展宏图了。我们可以根据密码的应用场景来设计密码。本文推荐的密码应用体系包含四类密码,它们的强度与应用性各有差异:
- 用于关键平台(比如微信、QQ、学信网等主要平台)
- 用于金钱相关的需要特别加密的平台(支付密码)
- 用一般社交兴趣网站(哔哩哔哩、知乎、微博等)
- 用于杂毛网站(用后即弃的,很少再用的)
管理
再好的密符,再好的应用体系,也绝非灵丹妙药,难以保证长久的安全,在此笔者对于个人密符的管理提出来一些建议
老生常谈
- 定期更换
- 不滥用
- 使用密码管理软件
- 使用密码生成器,搭配特定软件自动填写
密码保护
众所周知,密码学发展至今,已经出现了许多优质的加密方法。对称密码算法如DES,AES等,它们使用一个秘钥来进行加密,在秘钥安全的情况下,硬破解极为困难(废话)。还有现代最为广泛应用的非对称加密——公私钥体系,这类密码利用了数学上的陷门单向函数,有RSA,DHM(区块链上有很多应用)等。以及从公钥体系发展来的数字签名算法使用哈希函数来进行防篡改验证,算法有MD5, SHA系列,DIMON等。最后还有为了抵抗量子计算机而研制的抗量子加密算法,有Merkle(基于哈希) 、HFE(基于多变量)、NTRU系列(基于格,在2020年openssh 9.0将其作为默认加密算法) 。密码保护,顾名思义,就是用加密算法把设计好的密码进行加密,这样即便密码不小心泄露,别人也无法破解出来真正的密码。你甚至可以把加密好的密码,明文放到网络上,就以稍微落后的AES加密算法来讲,破解起来也要费好些功夫。当然,谁会对你没几个钱、没几个朋友的账户感兴趣呢?
下面以OpenSSL软件为基础,实操一下[1]
使用AES来加密文件
加密过程中会要求输入一个加密密码,重复输入两次即可完成对文件的加密。解密一个文件的时候会要求输入加密文件时设置的密码才能进行解密。
- 使用 AES-256方法来加密一个文件 (data.zip 为原始文件,back.zip 为加密之后的文件)
1 | # openssl enc -e -aes256 -in data.zip -out back.zip |
- 使用 openssl 解密一个文件 (back.zip 为加密的文件,data.zip 为解密之后的文件)
1 | # openssl enc -d -aes256 -in back.zip -out data.zip |
- 解释
- enc:表示对文件进行对称加解密,
- -e: 表示对一个文件进行加密操作
- -d 表示对文件进行解密操作
- -aes256: 表示使用 aes256 算法进行操作
- -in:表示需要被加解密的文件
- -out: 表示加解密之后生成的新文件。
使用RSA来加密文件
- 首先需要使用 openssl 生成一个 2048 位的密钥 rsa.key 文件 (rsa.key 密钥文件中包含了私钥和公钥)
1 | # openssl genrsa -out rsa.key 2048 |
- 然后从 rsa.key 密钥文件中提取出公钥 pub.key
1 | # openssl rsa -in rsa.key -pubout -out pub.key |
- 使用 pub.key 公钥加密一个文件 (data.zip 为原始文件,back.zip 为加密之后的文件)
1 | # openssl rsautl -encrypt -inkey pub.key -pubin -in data.zip -out back.zip |
- 使用 rsa.key 私钥解密一个文件 (back.zip 为加密的文件,data.zip 为解密之后的文件)
PGP/GPG 公钥加密信息
相信细心的网友会在某些博客站点的关于界面看到一堆如下的内容
1 | -----BEGIN PGP PUBLIC KEY BLOCK----- |
这就是GPG/PGP公钥,作用就是发送加密信息给站长。具体就是用这条公钥来加密发送的内容(访客),而只有拥用对应私钥的人(站长)才能解读。
1 | - class_name: 网站 |
本站也提供了基于NIST的抗量子算法ed25519生成的GPG/PGP公钥,见关于页面
Chat-GPT的建议
你是一名密码学领域的教授,请设计一些个人日常用的密码,这些密码应该有两个最基本特点:强私人性与易于记忆。
当设计个人日常用的密码时,建议采取以下措施以确保强私人性和易于记忆:
-
使用短语作为密码:选择一个容易记住的短语,例如 "我的狗叫做巴比",并将其转换为一个密码,例如 "WdJzBbBb!",其中 W 是 "我的" 的首字母,d 是 "狗" 的首字母,z 是 "叫做" 的中间字母,以此类推。
-
添加数字和符号:将密码中的字母替换为数字或符号,例如将 B 替换为 8 或 %,将 S 替换为 5 或 $。这样可以让密码更加复杂和难以猜测。
-
使用不同的密码:不要在多个帐户上使用相同的密码,因为如果某个网站发生数据泄漏,黑客可以使用您的密码尝试登录其他网站。
-
定期更改密码:定期更改密码可以减少黑客攻击的风险,并且可以确保您的密码对那些已经获得它的人无效。
-
使用密码管理器:使用密码管理器可以帮助您存储和管理所有的密码,使其易于查找,同时也可以生成更加安全的密码。
总之,一个好的密码应该是既强私人性又易于记忆的。通过使用这些建议,您可以创建一个更加难以破解的密码并保护您的个人信息。
类似于前两点的方法可以再多补充一些吗?
当设计个人日常用的密码时,除了使用短语和添加数字和符号外,还可以采取以下措施以确保强私人性和易于记忆:
-
字母大小写混合:在密码中混合使用大写字母和小写字母可以使密码更加复杂。例如,将 "我爱跑步" 转换为 "W@RunL0ver"。
-
隐藏密码信息:使用密码中第 n 个字符之后的字符作为真实密码,例如将 "我的生日是1985年3月25日" 转换为 "@9853m25d"。
-
密码长度至少为12个字符:较长的密码比较短的密码更加安全,因为它们更难猜测。建议密码长度至少为12个字符。
-
避免使用常见单词和短语:不要使用容易猜到的单词或短语(如 "password" 或 "123456"),因为这些密码很容易被黑客破解。
-
避免使用个人信息:不要在密码中使用您的姓名、生日或其他个人信息,因为这些信息可能很容易找到,并通过猜测密码访问您的帐户。
-
使用多种字符类型:使用数字、符号和字母的组合可以增加密码的安全性,例如将 "我喜欢吃巧克力" 转换为 "IL0v3@Ch0c!"。
总之,一个好的密码应该是既强私人性又易于记忆的。通过使用这些建议,您可以创建一个更加难以破解的密码并保护您的个人信息。