密码系统 6 分钟指南

密码系统 6 分钟指南

原文:https://medium.com/hackernoon/a-6-minute-guide-to-password-systems-52f1857dc0ec

实现应用的第一道也是最后一道防线。

Photo by Antonina Bukowska on Unsplash

“这个世界上有两种加密技术:一种是阻止你妹妹阅读你的文件的加密技术,另一种是阻止主要政府阅读你的文件的加密技术。”—布鲁斯·施奈尔

荷兰密码学家 Auguste Kerckhoffs 曾经说过,一个系统应该是安全的,即使除了它的密钥之外,关于这个系统的一切都是已知的。在互联网的情况下,随着网络应用程序作为系统,密码已成为新的关键。毫不夸张地说,你最有价值的信息可能隐藏在你所有的社交媒体、云存储、数字银行等等之中。所以,你和可能劫持你生活的数字窃贼之间的第一道也是最后一道防线就是你的密码

新闻出版物都被香蕉超过安全漏洞,然而对于后端开发的初学者来说,安全通常是最令人生畏的任务。我开发后端系统已经有几年了,但它仍然让我感到不安。因此,本指南的目的不是提供后端代码,而是为新开发人员提供一个好的密码系统的框架。

散列法

因此,您可能了解密码使用的基本知识:

  1. 用户注册时提供密码。
  2. 密码存储在数据库中。
  3. 当用户稍后登录时,会将其尝试的密码与存储的密码进行比较。

但是第二步是怎么发生的呢?如何安全地存储密码

在任何好的密码系统中,步骤 2 的基础在于使用散列算法。在现实世界中,我们不只是将密码存储在数据库中。我们存储了一个名为hash 的密码表示。那么什么是哈希算法呢?

哈希算法是一个函数,当输入任意大小的字符串时,它将产生一个固定长度的字符串,称为哈希。更简单地说,哈希算法是一种单向函数,每次都将任何大小的文本转换成长度完全相同的文本。

hash(“password”)= 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8hash(“p4ssword”)= eca8e05d94c236e78c389e15e1cad71ff9326bdfa5e1d79d92766f38414e66e5// 1 different character = completely different hasheshash(“password”)= 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8// same input string = same output hash (every time)

这是通过改变和解释输入文本直到它与原始字符串一点也不相似来实现的。例如,通常使用的 SHA-256 算法总是产生 256 比特的输出,总共有 2 个⁵⁶可能的输出。因此,当两个不同的输入字符串产生相同的输出时,很难产生冲突。事实上,在超过 115 个 quattuorvigintillion 中有 1 个的几率(那是一个实数;它有 78 位数长)来产生碰撞。

创建新用户时,不是将明文密码存储在数据库中,而是使用哈希算法存储密码的哈希。每当该用户稍后登录时,他们登录时使用的任何密码都会被散列,并与原始密码的散列进行比较以验证用户。这是因为即使黑客能够闯入数据库并查看其内容(这种情况比您想象的更常见),哈希也能有效地隐藏每个密码,即使黑客知道使用的是哪种哈希算法。

克尔克霍夫会很自豪的。

一些需要记住的事情:

1.对于相同的输入,哈希算法会产生相同的输出。 2。稍微不同的输入会产生完全不同的输出。 3。一个好的哈希算法可以最大限度地减少冲突。

或者只使用 bcrypt(在最后一节中介绍)。

好的密码

"cats_name_birth_year" = bad password“1Q8w$BSLsC” = good password

首先,什么是安全密码?

最好的密码不一定是同时包含数字、大小写字母和特殊字符的密码。超过 8-10 个字符的密码也是如此。相反,这些网络指南所做的是鼓励用户扩大密码的多样性,以(希望)创建一个独一无二的密码。最好的密码是没人用过的密码。原因如下。

让我们做一些快速的数学运算。

使用 10 个字符,您的标准 26 个小写字符将为您提供 2⁶ ⁰可能的密码选项。这是一个很大的数字——准确地说是 141,167,095,653,376。然而,我们也有 26 个大写字母可供我们使用(52 个可能的字符),这使我们的总密码数乘以 1000。当您添加特殊字符和数字时,我们的密码总数(禁止条件)是 59,873,693,923,837,890,000。

这个数字大得惊人,甚至让你无法理解。一个更容易理解的指标是破解一个给定密码需要多长时间。使用原始的 SHA256 散列算法,暴力破解整个密钥空间需要大约 73.8 万年。

看起来足够安全了吗? 是啊,对。

Sort of relevant XKCD

盐碱滩

A hacker’s best friend. (photo credits: kedeleducation)

尽管不可能对给定的哈希进行逆向工程,但我们已经标准化了像 SHA 这样的哈希算法。

这意味着黑客可以编译被称为常用密码字典的庞大数据集,并自己散列每个密码,以查看是否有任何相应的散列等于原始密码散列。另一种技术是预先计算字典的哈希值,并将它们放入一种称为查找表或彩虹表的数据结构中,这使得确定原始密码更加容易。由于大量的散列只能被计算一次并被重用,这些类型的攻击可能是高效的。

对抗这种黑客方法的最佳方式是使用:哈希时添加到密码中的额外随机字符。每个密码需要不同的 salt,但是明文 salt 可以和密码一起存储。这怎么安全?

Salting 可以保护您的密码,因为 salting 会使存储在查找表中的所有散列变得无用,因为使用 salt 会完全改变散列。黑客最终将不得不求助于暴力破解密码。你的密码又(或多或少)安全了。

hash(“password”) = 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8hash(“password” + “salt”) 7a37b85c8918eac19a9089c0fa5a2ab4dce3f90528dcdeec108b23ddf3607b99// completely different hash

生产中的哈希

那么,你能不能只采用 SHA256 实现,再加上一个安全的 salt,然后就到此为止呢?稍等一会儿。

原来你不能只推出自己的认证。当破解密码的唯一限制是 GPU 的运行速度时(GPU 每年都在变快),你的安全系统将开始像一个定时炸弹。为了解决这个问题,大多数现代认证系统使用一种叫做密钥拉伸的技术。

(用这个比喻:一把伸出来的钥匙需要更长的时间才能插入一个孔中,以检查它是否是正确的钥匙)

密钥拉伸的工作原理超出了本指南的范围,但从本质上来说,这种技术使得黑客很难在短时间内测试出一堆哈希,因为它会降低哈希算法的速度,并迫使黑客在生成哈希之前等待(相对)很长时间。

bcrypt 中使用了一种流行的密钥扩展实现,bcrypt 是 1999 年专门为密码开发的密码哈希库。在一个技术快速超越自身的世界里,bcrypt 的时代证明了它的强大。从 node.js 到 C,这个库可以用任何语言编写,甚至可以生成一个密码安全的 salt 来防止 rainbow 攻击。有用吧?

hash = bcrypt.hash(“passw0rd”, salt_length)// cue Staples Easy Button

一些现实世界的建议

使用 bcrypt 之类的库,使用双因素身份验证,跟踪网络安全的新兴趋势,并经常进行渗透测试。

如果你从这个指南中学到了什么,我希望是这个:永远不要推出你自己的认证。

您的安全不仅仅是与黑客竞争,也是与其他安全系统竞争,因为黑客可以毫不费力地将其他黑客技术应用到您的系统中。

记住这一重要的教训,你应该对安全系统有足够的了解。祝你好运!🙌

[## 埃洛尔

智能机器和它们背后的智能猴子

medium.com](https://medium.com/the-elore-blog)

如果你喜欢有趣的计算机科学主题的速成课程,可以看看 elore !我们制作了像这样的很酷的文章,主题从机器学习到黑客马拉松。🐒


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除