程序员人生 网站导航

基于 nonce 的用户身份验证协议

栏目:互联网时间:2015-01-29 08:52:15

1:甚么是nonce 

维基百科:安全工程中,Nonce是1个在加密通讯只能使用1次的数字。在认证协议中,它常常是1个随机伪随机数,以免重放攻击。


2:举例说明

1个典型的基于 nonce 的验证协议以下:

基于 nonce 的验证协议

        这里的 cnonce 为 client nonce(后面将讨论为何需要 cnonce)。Client 其实不直接发送密码(或密码直接加密后的密文)用以免攻击者直接盗取密码(或密码直接加密后的密文)并冒充用户进行身份验证。

先不斟酌 Client nonce。Server 首先发送 nonce 到 Client,Client 将密码和 nonce 通过 hash 运算再提交到 Server 进行身份验证,这样我们可以认为(而非绝对)每次用于身份验证的 hash 值都不相同,即便攻击者盗取了前1次用于身份验证的 hash 值也没法冒充用户进行登录。公式以下:

A = Hash(nonce, password)

在不安全的网络环境中,A、nonce、Hash 算法都可以被攻击者获得,如果能够满足以下条件:

  1. nonce 仅仅被使用1次
  2. Hash 运算不出现冲突

攻击者则在理论上没法实行 Replay attack。 因此 nonce 在特定上下文中仅仅被使用1次和 Hash 算法尽可能避免冲突是安全的关键。为了确保 nonce 在特定上下文中仅仅被使用1次,可使用以下策略生成 nonce:

  • nonce 可以是1个时间相干变量
  • nonce 可以是1个通过足够随机算法生成的足够长的 bits

        以上算法难以免攻击者使用字典进行密码破解。其中1个可行的方法为:攻击者可以截取 A = Hash(nonce, password) 中的 A、nonce,然后通过字典破解用户的密码 password。不过破解的进程是很耗时的,使用1个中等范围的集群(medium-scale cluster)可能需要数周),如果期望破解不计其数用户的密码,那末将消耗极大量的时间。

       如果攻击者能够构建1个预计算的表(例如 Rainbow tables)那末破解大量用户密码的时间将大大缩短。nonce 禁止了预计算表的生成(由于 Server nonce 每次都不相同),但是如果网络中传输的数据能被篡改,情况就不1样了。假定攻击者捏造1个固定的 nonce 发送给网络中的 Clients 并且记录 nonce 和 Clients 的回应(Hash(nonce, password)),由于 nonce 为1个固定值,那末攻击者就能够构造1个预计算的表,此表使用此固定的 nonce。通过此表便可大大缩短破解用户密码的时间了。

       为了不攻击者通过以上手段构建预计算的表。在 Client 也引入了1个 nonce。这样,每次都不同的 cnonce 避免了预计算表的生成。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐