按 ‘ 加密 ’ 标签归档

程序员入伙书——“会报警”的取款机

keyboard-sketch

有个传言流传很久了,说是如果你被歹徒胁迫去ATM取钱,不妨把密码倒着输,如123456输成654321,然后,ATM就会一边吐钱给你(为了防止歹徒翻脸攮你一刀),一边偷偷替你报警。

这个传言的虚假性挺明显的,不过就我所知,办公室里曾经有人,看到这消息时,兴奋地念给大家听,完全辱没了自己程序员的身份。最近一念忽然想起了搁笔已久的《程序员入伙书》,该继续往下写了。这一篇并不算是真正介绍编程语言或技巧的,而是作为《程序员入伙书——两个世界》的补充篇,帮助大家习惯计算机的思路。

即使不是学编程的读者,这篇文章也可以算是足够浅显的逻辑训练,教大家识别都市传说真伪的套路。

假如我是程序员,被客户——或者啥也不懂、就知道和客户沆瀣一气的销售员——要求设计这样一个ATM:正着输密码就心平气和地吐钱,倒着输密码就边吐钱边报警。

我的第一个问题就是:万一用户的密码是888888怎么办?(暴发户脑子不好使,就记得这种密码)或者稍微复杂些的:158851,你到银行输这个密码,取款机该不该报警?当场就把在办公室传这个消息的人们问趴下了,我想,给我布置这个任务的客户也只好收回成命。

接着再说点深的,我努力做到循序渐进,先易后难。

首先说的就是,这个传言有个过于简单的假设(请记住“过于简单”这个词,文章结尾要用),就是“银行知道客户密码,所以知道密码是反着输的”。山寨银行或者骗子银行可能真知道客户密码,但正规的银行一定不知道,理由有浅有深。

浅显的原因是,银行的老大也要存钱,银行老大一定不喜欢任何人——柜台、出纳、甚至机器——看到或记住他的密码。你可能会问为啥让机器记也不可以,因为机器是人类维护的。如果银行知道客户密码,知道底细的老大就不愿意在自家银行存钱,更不愿意把钱存到别家银行。平民百姓也倒罢了,那几个小钱有跟没有差不多,如果银行的任何角落里留有客户密码,那么越有钱的人越不敢把钱往银行里搁。

深一点的原因,是这样可以保护银行自己。虽然银行都很贪,也确实在拿着所有客户的银子胡来,他们却不敢偷具体客户的存款,非但不敢偷,甚至还要做到“想偷都偷不出”。这样,万一有人状告银行在系统地盗用客户密码,银行就可以向调查者公开源程序:你们看,我们的系统真的无法窃取或透露用户密码,所以任何用户的钱因为取款取丢了,都是他自己没看好密码,我们没有赔偿责任。

定理:胆敢存储用户密码的银行,一定无法开张、即使开张也倒闭得最快最惨。

所以,每当我看到老太太们费力地按了六个键之后问柜台:“我按的是441205么?”再补一句“就是我的生日。”我都禁不住打哆嗦:老太太你这是要害死小姑娘啊!人家真的没看见你的密码,也不想听见你说的。再说你自己耳朵背,就非得嚷这么大声啊?我听见你的密码,都起歹意了……

那观众就要问了:银行不知道我们的密码,那我们怎么取钱的?取款机怎么知道我们输对还是输错了?
猛击阅读全文