Lec02-人员身份验证

由于时间精力有限,目前只翻译部分内容。
本文使用人工智能协助翻译,内容仅供参考,可能有错误或遗漏。如果你对内容或超链接有疑问,可以查看原文。
参考资料地址:https://github.com/PKUFlyingPig/MIT6.1600

1 认证

通常情况下,计算机系统在处理请求之前会执行两个步骤请求:

  1. 验证: 识别发出请求的人或机器(“当事人”)。
  2. 授权: 决定委托人是否有权提出请求。

2 密码(Passwords口令)

我们真正关心的是,对手将无法在少量的猜测中猜出你的密码。

理想情况下,我们希望从对手的角度来看所有密码的可能性都是相同的。但事实并非如此。人们必须记住自己的密码,结果很多人可能会选择相同的密码。

我们如何说服人类选择难以猜测的密码?

  • 需要更长的密码?
  • 禁止在密码中使用常用的英语单词吗?
  • 强制更改密码?
  • 是否要为该用户生成密码?

因此,尽管我们尽了最大努力,用户可能会选择简单的密码。为此,我们能做些什么呢?

2.1 处理糟糕的密码

一个“好”密码可能从一个大约20位熵的分布中采样。用目前的技术,猜测$2^{20}$次是很容易的。因此,当使用密码作为认证机制时,我们必须找到一种限制猜测的方法。

处理密码很容易猜测这一事实的一个标准方法是限制攻击者对密码的猜测次数。限制猜测的数量可以有效地防止单个账户被泄露——前提是密码不会太弱。一个缺点是猜测限制造成了拒绝服务攻击的可能性:攻击者可能会对你的密码进行10次猜测,并将你锁在你的手机或网上银行账户之外。

此外,在许多物理计算机系统中,都有多个授权用户,每个用户都有自己的密码。如果猜测限制只在每个用户的基础上强制执行,那么如果允许对每个用户的密码猜测10次,攻击者通常会破坏机器上的某些帐户。防止这些类型的攻击需要一些额外的措施:网站通过IP限制使用密码验证身份的速率,或使用验证码,等等。

2.2 存储密码

正如我们所看到的,密码很容易猜测,因此完全避免基于密码的身份验证是最安全的选择。

当系统必须使用密码进行身份验证时,存储密码的最安全的方法(例如,在服务器上)是使用加盐的加密密码哈希函数。其目标是根据存储在服务器上的哈希值,使攻击者尽可能难以恢复明文密码。

服务器选择一个随机的128位字符串,称为,并且服务器存储盐和哈希值 $h = H(salt∥pw)$ ,$H$ 是一个特殊的密码哈希函数。

然后,服务器存储一个像这样的表:

usersalt$H(salt∥pw)$
alice$r_a$$h_a$
bob$r_b$$h_b$

同样,服务器可以使用盐和哈希函数来计算一个值 $h’=H(salt∥pw’)$ 。如果此散列值 $h’$ 与此用户的服务器存储值 $h$ 匹配,则服务器接受密码。

  • 密码哈希函数H被为相对耗时的计算,这使得攻击者更难以强制反转哈希值,因为每次猜测密码都需要一秒钟的计算。(而不是计算标准哈希函数所需的微秒,比如SHA256)。
  • 使用每个用户的随机盐,确保了对一个用户的密码的猜测在转换另一个用户的密码哈希时是无用的。加盐还可以击败预计算攻击,攻击者预先计算许多常见密码的哈希,以加速稍后的哈希反转步骤。

3 网络认证

到目前为止,我们一直在讨论人类对设备(ATM、电话、笔记本电脑等)进行手动身份验证,通过在设备中物理地输入PIN或密码。但是我们经常登录到网络上的一些服务器——Facebook、Gmail、MIT等等。在这个场景中,我们可以获取到更多身份验证机制和要求的安全属性。

3.1 密码管理器

当使用密码对网站进行身份验证时,用户可以在他们的计算机上安装一个密码管理器,从而为他们生成随机密码。由于用户不需要记住这些密码,它们可以从高熵分布中真正随机抽样。一旦用户登录到他们的电脑,他们就可以访问他们随机生成的密码,并使用它们登录到他们的网站。

但是基于密码的身份验证,即使有一个强大的密码,仍然需要通过网络发送密码。如果一个对手可以监视我们的网络,他们就可以看到我们的密码。我们稍后将讨论传输后安全,它可以防止网络窃听者,但更好的解决方案是在不通过网络发送密码的情况下进行身份验证。

3.2 挑战-响应协议

我们现在假设我们的计算机有一些密钥k(例如,一个随机的128位字符串),并且服务器也拥有相同的密钥k。

  1. 服务器选择一个长随机字符串r,我们通常称其为nonce,并将其发送给身份验证客户端。
  2. 客户端计算一个身份验证“标签”t←MAC(k,r),其中MAC(·,r)如果不知道k很难计算。(这里的函数MAC是一个消息认证码,我们将在??中更具体地讨论它)将MAC标记t发送到服务器。
  3. 服务器从客户端接收到一个标签t‘,并确保t’=MAC(k,r)。如果是,则服务器认为身份验证已成功。

在实践中,客户端通常希望同时向服务器进行身份验证并发送请求请求,例如req= rm file.txt。为了实现这一点,客户端可以计算MAC标记t作为treq←MAC(k,r∥req),然后客户端将这对(treq,req)发送到服务器。通过这种方式,服务器可以同时对客户端进行身份验证,并确保请求请求来自客户端。

[!NOTE] Info
客户端同时向服务器进行身份验证并发送请求的一种不安全的方法是,客户端计算MAC标记t←MAC(k,r),然后向服务器发送(t,req)。网络攻击者可以在发送到服务器的途中将客户端的请求修改为(t,req‘),而服务器无法检测到此攻击。

4 双因素身份验证

正如我们已经看到的,密码是一种弱的身份验证机制:人类不擅长选择强密码,攻击者擅长窃取密码数据库,同时恢复许多用户的密码。

加强基于密码的身份验证系统的一种常见技术是将密码与第二种身份验证方法结合起来——一种具有不同的失败模式。常见的身份验证方案有:

  • 一些你知道的东西:密码,PIN,等等
  • 一些你有的东西: USB钥匙,电话,等等
  • 一些你是的:生物识别技术(指纹,面部识别标识符)。。。

4.1 基于时间的一次性密码(TOTP)

在这种情况下,服务器会请求一个代码和密码。用户有一个设备,比如一个手机,它与服务器共享一个密钥k(例如,一个随机的128位字符串)。类似于MAC(k,gettimeofday()/30)。手机可以生成代码,并显示给用户,然后服务器可以通过重新计算代码来验证代码。

一个常见的攻击。 基于时间的一次性密码也是不完善的身份验证机制。例如,攻击者可以通过假装是技术支持人员、用户的雇主或客户服务代表,简单地要求用户给她提供一次性代码。这本质上是一种网络钓鱼攻击。然后代码可以持续30秒,所以攻击者就可以在网站的末端输入代码。类似的攻击还包括建立一个看起来像真实网站的假网站,等等。TOTP代码的一个好处(不像密码)是,攻击者必须在窃取后的30秒内使用被盗的TOTP代码,这需要更复杂的攻击。

[!NOTE] Info
网络钓鱼攻击是指攻击者欺骗用户泄露Gmail密码,例如,通过创建一个看起来像gmail.com登录页面的网站。

4.2 避免网络钓鱼:U2F(简化)

为了完全防止网络钓鱼攻击,我们可以使用一个更复杂的身份验证协议。如果我们在我们发送到该设备的请求中包含了用户试图登录到的服务器的名称,那么该代码将被绑定到一个特定的网站。例如,这些代码可能看起来有点像MAC(k,r∥amazon.com)。U2F密钥组数沿着这些线路使用一个协议来进行身份验证。如果攻击者设置了amason.com并让用户访问它,那么U2F设备将只生成一个适合amason.com的代码,而不是真正的amazon.com。

5 生物识别

生物识别学是一些物理特征,比如指纹、面部等。它们用于身份验证非常方便,因为您不会忘记它们,也不会轻易丢失它们。生物识别技术在亲自对设备进行身份验证时最有用,比如手机解锁,或授予用户访问安全保险库。在这些设置中,执行身份验证的设备有一个“可信的输入路径”,这可以提供一些保证,即拥有该生物特征的真人是在另一端。生物识别技术对于通过网络进行身份验证并不是那么有用,因为网络通常不提供可信的输入路径(也就是说,不提供任何生物识别读数来自真实的人类),而且生物识别数据本身也不是特别秘密。特别是,如果我们使用生物识别技术进行网络身份验证,一个知道你的指纹是什么样子的对手可以登录到你的账户。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇