开始:
我知道你所有的密码。你觉得震惊?
好吧,你不必担心,至少目前并不需要担心。
让我来慢慢告诉你一切真相。
因为一旦我这样做了,你就不会震惊了。你可能会愤怒,恐惧,甚至惶惶不可终日。
一旦你读完了这篇文章,你就不再会是原来的那个人,也许你会尽全力改变自己的密码体系。
1.
先让我问你一个非常简单的问题--你认为在你登录的过程中,程序是如何工作的?
假设你想登录你的QQ账号。
你转到登录页面。
输入您的用户名。
然后输入您的密码,该密码显示为星号“***”,以防止任何不必要的“密码泄露”。
这很直接,也非常有效,并且必要
你看,密码的第一定律(好的,这个短语只是编造的)规定,在整个宇宙中应该只有一个实体可以访问你的密码--你的大脑。
如果你的密码的第二个副本存在于某处--比如说,你在一张纸上随意写下它,认为它会帮助你以后记住它,或者在你刚刚输入它的密码框中,或者告诉某位挚友;有人可能能够访问它(理论上讲),你的安全就会完全受到威胁。
所以,假设你的大脑知道密码,那么你的密码就绝对安全了吗?
现在,你按下“登录”按钮。
但是朋友,等一下!
在你刚刚按下登录按钮后,你登录了。
这意味着另一端的某个系统必须已经验证了:你输入的确实是你该账号的密码。
但是,这个系统也必须有权访问你的正确密码!
否则,它会将你输入的密码与什么进行比较?
所以,QQ必须在某处保存你的密码的副本!
2.
主机网站需要一份密码副本!你是正确的。这确实是个问题。
你可能认为这是一件好事,因为这第二个副本将存在于QQ,这个网站会好好托管你的帐户。他们会保证它的安全,不是吗?
但想想吧。QQ,作为一个组织,就像你和我一样,是由人类组成的。如果QQ的某个员工可以访问这个代码,并且可以看到您的密码怎么办?
如果这是你的银行账户呢。如果QQ被黑客攻击,黑客可以看到包含你密码的代码。
想象一下这个人可能造成的破坏。所以第二份拷贝从来都不是好的,即使它存在于父网站本身!
但是,那么网站如何让你登录呢?如果它不知道您的正确密码,它会将您的输入与什么进行比较?它如何证明你就是你?
这正是我们的程序猿们在着手设计整个密码系统时所面临的问题。
但他们很聪明!他们想出了一个巧妙的主意,可以很好地解决这个问题。
3.
他们提出了哈希函数的概念。这个概念非常简单。
散列函数只是一个数学函数。你在其中输入任何单词,它就会生成一个看起来完全是垃圾的输出。同一个词总是会产生同样的垃圾。两个不同的词(几乎)总是导致两个完全不同的垃圾。没有办法看着垃圾,辨别原来的单词是什么。
对散列函数性质的基本数学限制,它们是不可逆的。它们只能单向运作。没有办法对垃圾进行逆向工程,并偷看产生垃圾的单词。即使你知道确切的哈希函数也不行。
4.
那么哈希在登录系统过程中是如何工作的呢?
第一次创建帐户时,你创建了密码。此密码永远不会被网站原样存储。相反,网站首先散列您的密码,然后将此散列存储在其数据库中。现在,当你下次尝试登录时,你在密码框中输入的输入首先被散列,然后发送到网站。如果你输入的密码是正确的,则此传入哈希将与网站先前存储在其数据库中的哈希相同。这是因为相同的单词总是给出相同的散列。另一方面,如果您输入了不同的内容,传入的哈希将与网站在其数据库中存储在您姓名旁边的哈希不同。
该网站比较这两个,如果它们匹配,你就可以成功登录!现在,即使有人黑进QQ并复制了整个数据库,他们也只能看到这些存储在用户名旁边的垃圾哈希。他们将无法从这些散列中推断出原始密码。
如果他们试图从数据库中复制您的哈希,在他们的浏览器中打开QQ登录页面,然后在密码字段中输入复制的哈希(以及您在用户名字段中的用户名),该怎么办?
因为QQ的登录流总是对传入的输入进行散列,所以它也会对这个散列进行散列,这将产生完全不同的结果。
在匹配与数据库中存储的内容,会显示登录失败。因此,即使黑客获得了整个用户表,他仍然不能造成任何损害!
5.程序猿们真的很给力,不是吗?现在看起来,这一切都很完美。
6.
除了,这对于公司来说实施和管理是一个彻底的痛苦。对于刚进入这个行业的来说,必须在登录流中集成哈希机制,这会导致相当大的开销。实际上,有了现代的数据库和框架,这部分就不再是什么难事了。
真正的痛苦在于向客户提供技术支持。
假设你是淘宝。一位客户打电话来抱怨他无法将某个项目添加到他的购物车中。
客户的问题交由开发团队处理,在那里,你,可怜的开发人员,只是碰巧在错误的时间出现在错误的地点!问题将分配给你去解决。
你只知道有一个客户使用这个特定的客户ID,并且他无法将项目添加到他的购物车中。这就是你知道的全部信息。就这些。请记住,用户可以在他的设备上实时看到发生的问题,但你不能。你没有访问他的帐户的权限。因此,您向服务器团队发送请求以访问服务器上的错误日志,同时祈祷,希望您在这些日志中找到一些有用的东西--这些东西将推动您朝着正确的方向前进。但你必须非常幸运才能找到有用的东西。
通常情况下,这个问题最终会变成一个徒劳的问题,因为用户正在做一些愚蠢的事情,而你会花一整晚的时间进行徒劳的追逐。如果你确实从日志中学到了一些有用的东西,那么您将不得不创建一个测试帐户并尝试在那里复制问题,这只是我们称为bug搜索的冗长乏味过程的开始。
不管怎样,你将做好加班到深夜的准备。
7.
但是如果,就只是打个比方,你确实可以访问用户的密码呢?
你可以简单地登录到他的帐户并检查这是否是徒劳的问题(用户自身操作失误)。你就能在五分钟内解决问题。
即使它被证明是一个合法的问题,您也可以从用户的帐户本身再次触发它,并获得关于bug位置的更快的线索!
这实在是太便利了!你开始变得充满信心了。
8.
但是你放弃了。
IT行业中大多数面向客户的公司都会将密码以直接的形式存储在他们的数据库中。
没有哈希!
有人作为渗透测试员工作过的大多数客户,他为之做过项目的大多数公司,他攻击过的大多数网站--所有这些都是以赤裸裸的明文形式存储密码的。
一目了然。
放在那里让任何员工或黑客都能看到。
他见过数据库表--一排排明文密码--数十万个--都是肉眼可见的--成熟,直接,随时可以被利用--它们的所有者完全不知道,完全天真,安详地睡在自己的床上,毫无顾虑。
现在,公平地说,必须在这里承认,没有一个顶级网站会做这种蠢事。
百度没有这么做。
QQ不会这么做的。
淘宝不会这么做的。
你的银行,绝对也没有。
但是二级和三级网站呢?某个创立不久的网站?
但这还不是全部-
大多数人,在一种极其愚蠢的行为中,为他们的所有帐户设置了相同的密码。这早已不是秘密。
因为让我们面对现实吧,他们是一样的。不是吗?
我所要做的就是破解某个你注册过的小网站,它们比较简单,这将是小菜一碟。像这样的网站在安全性上不是很重要。
一旦我进入他们的数据库,我就可以访问数以千计的电子邮件ID和密码对。
而且幸运的话,某些人的银行密码也可以被试探出来!
end。