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

一:什么是nonce 

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

二:举例说明

一个典型的基于 nonce 的验证协议如下:

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

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

A = Hash(nonce, password)

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

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

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

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

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

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

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

时间: 2024-08-10 22:17:36

基于 nonce 的用户身份验证协议的相关文章

用户不能用质询握手身份验证协议(CHAP)作身份验证

错误提示: 用户不能用质询握手身份验证协议(CHAP)作身份验证.没有此用户的可逆加密的密码.为了确保启用了可逆加密的密码,可以检查网域密码策略或用户帐户上的密码设置. 解决办法:I had that policy set and it was not fixing my issue.  The reason why it wasn't fixing my issue, once you have this policy set you have to reset the password. 

Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证

Python tkinter 实现简单登陆注册 最终效果 开始界面 ? 注册 登陆 ? 源码 login.py # encoding=utf-8 from tkinter import * from tkinter import messagebox as tkMessageBox import mysql_connect as mys import pymysql import base64 #加密 将用户的密码加密后储存到数据库 def encryption(str): str=str.en

Nginx集群之基于Redis的WebApi身份验证

目录 1       大概思路... 1 2       Nginx集群之基于Redis的WebApi身份验证... 1 3       Redis数据库... 2 4       Visualbox虚拟机ubuntu下的redis部署... 3 5       编写.NET WebApi的OnAuthorization身份验证... 6 6       编写.NET WebApi的ActionFilterAttribute令牌验证... 8 7       编写.NET WebApi的服务端.

《Apache服务用户身份验证管理》RHEL6.3

1.安装apache软件包 Yum install httpd 2.启动apache服务 /etc/init.d/httpd restart 3.创建一个目录,内编辑一个index.html文件 4.给这个目录设密码(是不是很passwd文件内用户的密码文件很像) 5.编辑apache配置文件/etc/httpd/conf/httpd.conf文件(添加如下行) 6.重启apache服务 7.验证是否配置成功 8.结果 <Apache服务用户身份验证管理>RHEL6.3,码迷,mamicode

IdentityServer4 使用OpenID Connect添加用户身份验证

使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API . 本文环境:IdentityServer4 1.0  .NET Core 1.0.1 下面正式开始. 新建IdentityServer4服务端 服务端也就是提供服务,如QQ

Github官方app分析——用户身份验证模块

这篇文章记述的是我对Giuhub官方app的用户身份验证模块的分析. Giuhub的官方app虽然是一个非常小众的程序,但是从程序的设计的角度看,这是一个非常优秀的项目.对于其用户身份验证模块,给我留下的印象更是非常深刻.如果你对此有兴趣,请移步到我的blog,地址如下: 地址: http://kohoh1992.github.io/GithubAppAccountAuthenticatorAnalysis/ 哦,对了.忘记补充了,这里的文章全部都是我个人blog上的副本.如果你对我的blog有

教你xshell如何使用公钥用户身份验证

如要启用公钥用户身份验证,用户应创建由公钥和密钥组成的用户密钥对.在进行公钥验证时,由Xshell用密钥来创建用户签名,SSH服务器则用公钥来确认其签名. SSH服务器和Xshell均能创建用户密钥,如在服务器上创建密钥,用户需利用Xshell的导入功能把密钥注册到Xshell密钥保存位置.如在Xshell上创建密钥用户应把公钥注册到服务器. 一.如何创建用户密钥: 在[工具]菜单选择[用户秘钥生成向导]. 按照用户秘钥生成向导的提示创建用户秘钥.想要获得产品密钥可以参考:如何注册激活Xshel

MVC4商城项目二:用户身份验证的实现

用户身份验证,依赖于 forms 身份验证类:FormsAuthentication,它是一串加密的cookie 来实现对控制器访问限制和登陆页面的访问控制.它在浏览器端是这样子的: 需求:我们要实现对用户中心只有登录的用户才能访问,如果没登录就跳转到登录页面,其它页面都可以访问: 首先来看登录控制器的代码: UserDto user = UserService.GetUserById(Convert.ToInt32(msg.Msg)); //为提供的用户名提供一个身份验证的票据 FormsAu

asp.net 如何配置authentication,完成基于表单的身份验证

步骤一: 在根目录下的web.config中加入: <system.web> <authentication mode="Forms">             <forms loginUrl="Login.aspx" defaultUrl="admin/admin.aspx" name=".ASPXFORMSAUTH" timeout="20">