Unix 50 年:Ken Thompson 的密码
50年前,除了Apollo上天之外,还有一个大事的发生,就是Unix操作系统的诞生,若干年前我写过《Unix的传奇,上篇,下篇》,Unix是我入行前十年伴我成长的操作系统,虽然现在Linux早已接过了Unix的时代交接棒,但是,Unix文化对我个人的技术观影响是非常大的(注:《Unix编程艺术》是一本对影响我很深的书),而对于 Ken Thompson 和 Dennis Ritchie 这两位 Unix 的缔造者,也是计算机圈中的神一般的人物。今天,Dennis已经去逝,Ken在Google里跟 Rob Pike和 Robert Griesemer 这两位大神在开发Go语言。
P.S. 今年,我一直想写篇Unix 50周年纪念的文章,但一直无从下手,因为不想写过大的命题,如果能写个轶事最好不过。正好过完国庆节,技术圈里有个“热搜”——Ken Thompson的密码。但一直没有时间,所以拖到今天才写下来。
正文开始,2014年,有个叫Leah Neukirchen的程序员(blog)在 BSD 3 的源代码中的 /etc/passwd
看到了早年Unix黑客们的被 hash了的密码,该文件如下所示:
root:OVCPatZ8RFmFY:0:10:Ernie Co-vax,4156427925:/: daemon:*:1:1:The devil himself:/: bill:.2xvLVqGHJm8M:8:10:& Joy,4156424948:/usr/bill:/bin/csh ozalp:m5syt3.lB5LAE:40:10:& Babaoglu,4156423806:/usr/ozalp:/bin/csh sklower:8PYh/dUBQT9Ss:2:10:Keith &,4156424972:/usr/staff/sklower:/bin/csh kridle:4BkcEieEtjWXI:3:10:Bob &,4156426744:/usr/staff/kridle:/bin/csh kurt:olqH1vDqH38aw:4:10:& Shoens,4156420572:/usr/staff/kurt:/bin/csh schmidt:FH83PFo4z55cU:7:10:Eric &,4156424951:/usr/staff/schmidt:/bin/csh hpk:9ycwM8mmmcp4Q:9:10:Howard Katseff,2019495337:/usr/staff/hpk:/bin/csh tbl:cBWEbG59spEmM:10:10:Tom London,2019492006:/usr/staff/tbl: jfr:X.ZNnZrciWauE:11:10:John Reiser:/usr/staff/jfr: mark:Pb1AmSpsVPG0Y:12:10:& Horton,4156428311:/usr/staff/mark:/bin/csh dmr:gfVwhuAMF0Trw:42:10:Dennis Ritchie:/usr/staff/dmr: ken:ZghOT0eRm4U9s:52:10:& Thompson:/usr/staff/ken: sif:IIVxQSvq1V9R2:53:10:Stuart Feldman:/usr/staff/sif: scj:IL2bmGECQJgbk:60:10:Steve Johnson:/usr/staff/scj: pjw:N33.MCNcTh5Qw:61:10:Peter J. Weinberger,2015827214:/usr/staff/pjw:/bin/csh bwk:ymVglQZjbWYDE:62:10:Brian W. Kernighan,2015826021:/usr/staff/bwk: uucp:P0CHBwE/mB51k:66:10:UNIX-to-UNIX Copy:/usr/spool/uucp:/usr/lib/uucp/uucico srb:c8UdIntIZCUIA:68:10:Steve Bourne,2015825829:/usr/staff/srb: finger::199:199:The & Program:/usr/ucb:/usr/ucb/finger who::199:199:The & Program:/usr/ucb:/bin/who w::199:199:The & Program:/usr/ucb:/usr/ucb/w mckusick:AAZk9Aj5/Ue0E:201:10:Kirk &,4156424948:/usr/staff/mckusick:/bin/csh peter:Nc3IkFJyW2u7E:202:10:& Kessler,4156424948:/usr/staff/peter:/bin/csh henry:lj1vXnxTAPnDc:203:10:Robert &,4156424948:/usr/staff/henry:/bin/csh jkf:9ULn5cWTc0b9E:209:10:John Foderaro,4156424972:/usr/staff/jkf:/bin/csh fateman:E9i8fWghn1p/I:300:10:Richard &,4156421879:/usr/staff/fateman:/bin/csh fabry:d9B17PTU2RTlM:305:10:Bob &,4156422714:/usr/staff/fabry:/bin/csh network:9EZLtSYjeEABE:501:50:*:/usr/net/network:/usr/net/network/nsh tty::504:50::/:/bin/tty我
(注,以前Unix是一个服务器,所有人都用一个终端到服务器上进行操作,于是,这个服务上的 /etc/passwd
下保存着所有的人的登录密码,能让所有的人都能读到,为了不让别人猜到,这个文件中的密码保存(第二列)被做过哈希处理)
这位程序员一看,这些个用户不就是Dennis Ritchie, Ken Thompson, Brian W. Kernighan, Steve Bourne, Bill Joy 这些神人的密码吗?!于是,他想看看这些人用什么样的密码。考虑到当时的加密算法用的是基于DES的 crypt(3) 算法(这个算法今天还在用,像Perl/PHP/Python/Ruby都提供crypt()
函数),而且当时的密码最长只支持8个长度,所以,感觉还是很容易暴力破解的。
一般来说,暴力破解的这种hash密码的工具主要是用hashcat 或 john ,很快,Leah 破解了大多数人的密码,因为大多数都使用的是比较弱的密码,比如: Brian W. Kernighan (bwk
)使用了 /.,/.,
这样的密码,而 Dennis Ritchie (dmr
)则使用了 dmac
这样的密码。然后,在破解到 Ken Thompson的密码时,搞不定了,花了好几天穷举完了所有的小写字母+数字都没有找到。
因为这个crypt
的算法也是Ken Thompson 和 Robert Morris 写的,他们在40年前就发现,原来的hash算法太快了,这样很容易被暴力穷举,于是在第七版的Unix(1979年发布),他们把算法改成DES的算法,就是要让这个算法变慢。详细地说,用户密码被截断为八个字符,每个字符仅被压缩为7位。这形成56位DES密钥。然后,该密钥用于加密全零位块,然后再次使用相同的密钥对密文进行加密,依此类推,总共进行了25次DES加密。感觉跟区块链的“挖矿”有点像。在最早的Unix计算机上,这个算法需要花了整整一秒钟的时间来计算密码哈希。
这几十年来,计算机的计算速度根据摩尔定律至少double了20次,所以,DES算法已经很容被攻击了,然而,对于Ken Thompson的密码,在2014年还是很不容易被破解的,因为,如果要加上所有的大小写字符数字和其它特殊字符,那么,在2014年,就算用最快的GPU来穷举所有的8位长度的密码,也需要花上至少2年以上的时间。
在2019年10月份,在 The Unix Heritage Society 这个社区中,这个事又被人问起来,说以前有个人破解这些密码,不知道有没有全破解出来了?于是Leah看到了,就回应说,那个人是我,但是还是没干出来……于是好些人进来留言。
5天后,2019年10月08日,一个来自澳大利亚的程序员Nigel Williams说,Ken的密码我破解出来了,哈希串ZghOT0eRm4U9s
明文是 p/q2-q4!
(果然是有数字有特殊字符),小伙说,我在 AMD Radeon Vega 64 的 GPU上运行了 hashcat
这个命令,干了我 4天多,每秒钟的“配速”是930MH/s (每秒钟9亿3千万次hash运算)。然后,Ken Thompson 也留言到 “恭喜” ,这样,Ken 的密码在40年后被破解了……
马上,就有人问到,这个密码是不是国际象棋的走棋?嗯,很像中国象棋中的“车五进一”,“马三退一”,这个密码中的 p
代表 pawn
小兵,从 q2
的位置走到 q4
,这个看来是国际象棋中的开局进兵——用来做登录密码,非常合适。而且,Ken Thompson 在 Unix中写下的一个国际象棋的程序 Belle,在1978年首次参加计算机协会的北美计算机国际象棋锦标赛时,它获得了第一个冠军头衔,其搜索深度为八层。之后又赢得了四次冠军。1983年,它也成为第一台获得国际象棋“大师”称号的计算机。所以,Ken用这个做密码相当make sense!
Ken在贝尔实验室调程序(图片来源:IEEE SPECTRUM)
当然,还有一个人的密码是所有人里最难破解的,这个人就是Bill Joy,他最初作为加州大学伯克利分校的研究生,在校期间着手改进Unix 内核,并管理BSD发行版。他最著名的贡献是ex和vi编辑器以及C shell。在Sun公司成立6个月后,他正式成为公司的联合创始人,他在Sun公司的推动了NFS,SPARC处理器,以及Java语言。他还是一个风险投资人员。
在Ken的密被破解后两周(2019年10月19日),有人号称已经破解了Bill的密码,他在邮件组中这样写到:
一开始,我使用了大小写字符和数字,8位长度来破解所有的组合,花了我6天的时间,失败了。然后,我开始尝试只用小写字母和控制字符,结果在40分钟内就破解了。但是因为Bill现健在,所以,只要bill同意他才公布这个密码。
在密码里存控制字符?这脑洞,Ctrl+C么?破解者还说,他在一个有三个结点的DELL 的HPC集群上完成这个工作,每个结点包括两个 Tesla V100 nVidia GPU 的显卡,一共30720个CUDA核…… 关于这个显卡多少钱,你可以上网搜吧…… 相当于一块劳力士吧……(我估计这组机器平时是用来挖矿的……[狗头])
好了,我们来看一下这个 /etc/passwd
中的这些人的密码是什么样的,但最主要的是向这些为人类做过巨大贡献的程序员科学家们致敬!
- Ken Thompson
除了是Unix、B语言和Go语言作者之外,他还贡献过正则表达式,QED/ed编辑器,UTF-8编码定义,以及计算机国际象棋Belle……登录名 哈希串 密码 ken
ZghOT0eRm4U9s
p/q2-q4!
- Dennis Ritchie
Unix和C语言之父,与Ken于1983年获图灵奖,1990年美国国家海明奖章,于2011年去世。登录名 哈希串 密码 dmr
gfVwhuAMF0Trw
dmac
- Brian W. Kernighan
AWK的作者,是AWK中的“K”,也是与Dennis写的K&C的C语言编程书中的“K”,他还编写了很多Unix的其它程序,如:ditroff
,而且,设计了著名的启发式算法。登录名 哈希串 密码 bwk
ymVglQZjbWYDE
/.,/.,
- Stephen R. Bourne
Bourne shell(sh
)的作者,Unix Shell作者,同时也是Unix调试器的作者。登录名 哈希串 密码 srb
c8UdIntIZCUIA
bourne
- Eric Schmidt
你可能知道他是Google的CEO,苹果的董事,但是你可能不知道,他当年是是贝尔实施室的实习生,他对Unix的词法分析器 Lex 进行为了完全的重写。他的密码是中的wendy应该是他的妻子。登录名 哈希串 密码 schmidt
FH83PFo4z55cU
wendy!!!
- Stuart Feldman
他除了是Unix系统小组的成员,他还是第一个Fortran 77 编译器的作者,也是make
的作者。他还是楼上Shmidt慈善基金会的科学负责人,在Google/IBM Research任过职,也担任过ACM的主席。登录名 哈希串 密码 sif
IIVxQSvq1V9R2
axolotl
- Mark Horton
Unix贡献者,包括vi和curses,后来变性为女性,新的名字叫Mary Ann Horton。原来的照片在Unix Guru Universe登录名 哈希串 密码 mark
Pb1AmSpsVPG0Y
uio
- Kirk McKusick
BSD贡献者,主要负责文件系统UFS以及fsck命令,同时也是gprof
的贡献者,公开的同性恋者。登录名 哈希串 密码 mckusick
AAZk9Aj5/Ue0E
foobar
- Richard Fateman
他在伯克利的VAX UNIX系统的开发工作中发挥了重要作用,以及开发了 Franz Lisp。登录名 哈希串 密码 fateman
E9i8fWghn1p/I
apr1744
- Peter Kessler
这位老兄能在网上查到的资料基本没有,可以查到他是gprof
的贡献者,以及有名字的gprof的一篇论文登录名 哈希串 密码 peter
Nc3IkFJyW2u7E
...hello
- Kurt Shoens
BSD电子邮件开发者。Unix早期版本中使用uux
和sendmail
来进行远程消息传递,1978年,Kurt为Unix编写了一个邮件用户代理 Berkeley Mail。相关的历史可以参看这篇文章。登录名 哈希串 密码 kurt
olqH1vDqH38aw
sacristy
- John Foderaro
他为Berkeley的Lisp语言编写原始的编译器,Lisp语言是一种类似于数据代数的语言,在计算机历史上有和C语言一样的作用。后来他成立了Franz公司,主要开发和部署图形搜索解决方案。登录名 哈希串 密码 jkf
9ULn5cWTc0b9E
sherril.
- Peter J. Weinberger
他就是AWK中的那个“W”,同时也是Fortan编译器f77的贡献者,后来是Renaissance Technologies (一家对冲基金)的CTO,现在在Google工作,登录名 哈希串 密码 pjw
N33.MCNcTh5Qw
uucpuucp
- John Reiser
他主要工作是将Unix和C移植到了DEC VAX上,这个机器在学术界相当流行(陈皓注:我在1994年上大学的时候,就是在这个机器上学习的C语言)。这扩大了Unix和C的影响力。登录名 哈希串 密码 jfr
X.ZNnZrciWauE
5%ghj
- Steve Johnson
曾在贝尔实验室和AT&T工作近20年。他以Yacc,Lint,spell和Portable C编译器而闻名。后来他去了硅谷,加入了一些创业公司,主要从事编译器的工作,以及2D和3D图形,大规模并行系统和嵌入式系统的开发工作。现在他在Wave Computing从事机器学习的工作。登录名 哈希串 密码 scj
IL2bmGECQJgbk
pdq;dq
- Bob Kridle
这位老兄的资料在没有太多,只能在 Berkeley Unix 20 年 上看到他跟Ken Thompson混过一段时间。登录名 哈希串 密码 kridle
4BkcEieEtjWXI
jilland1
- Keith Sklower
BSD 的一个程序员。从他的主页上可以看到他目前在Berkeley大学,信息分析师,主要研究一些网络通信相关的技术。登录名 哈希串 密码 sklower
8PYh/dUBQT9Ss
theik!!!
- Robert Henry
网上的资料不多,只在Life with Unix这本电子书中查到,他写了error
登录名 哈希串 密码 henry
lj1vXnxTAPnDc
sn74193n
- Howard Katseff
网上的资料不多,只在Life with Unix这本电子书中查到,他写了sdb
和last
登录名 哈希串 密码 hpk
9ycwM8mmmcp4Q
graduat;
- Özalp Babaoğlu
土耳其计算机科学家,1981年在Berkeley担任 BSD Unix的首席设计师,曾经与Sun的创造人Bill Joy在BSD上实现了虚拟内存。登录名 哈希串 密码 ozalp
m5syt3.lB5LAE
12ucdort
- Bob Fabry
他主要推动美国国防部高级研究计划局DARPA采用了Unix系统登录名 哈希串 密码 fabry
d9B17PTU2RTlM
561cml..
- Tom London
他和John Reiser在把Unix移植到了VAX-11机上。登录名 哈希串 密码 tbl
cBWEbG59spEmM
..pnn521
最后,再首尾呼应一下,在我的技术生涯中,Unix文化对我个人的技术观影响是非常大的,我个人认为 Unix 就像摇滚乐一样,上世纪60年代-80年代,是整个人类最经典最光亮的时代,值得我们每个人向那个时代的人和事致敬!
————————————————————————
P.S.
你可以浏览 Github 的 unix-history-repo 目录(注:本文给的这个链接不在master分支上),这个repo是40年前的代码,涵盖了从1970年创建时的2.5万行内核和26条命令到2017年为止广泛使用的2700万行系统。1.1GB的存储库包含大约一百万次提交和两千多次合并。通过这个链接你可以了解一下这个代码的历史!
下载这些代码需要你的1.5GB的硬盘空间,你可以查看各个大神写的代码,包括 Ken Thompson 和 Dennis的,以及相关的注释。
根据这些,你还可以找到 Ken Thompson的 Github账号 https://github.com/ken 以及别人为dmr建的github帐号 https://github.com/dmr-1941-2011
P.S.S
下面是一些和Unix相关的维基百科资料
- History of Unix
- List of Unix systems
- List of Unix commands
- List of Unix daemons
- Research Unix
- Berkeley Software Distribution
- Unix philosophy
还有Unix的社区:TUHS: The Unix Heritage Society – The Unix Tree