Nonce是Number once的缩写,在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值。

具体应用

在摘要认证中服务器让客户选一个随机数(称作”nonce“),然后浏览器使用一个单向的加密函数生成一个消息摘要(message digest),该摘要是关于用户名、密码、给定的nonce值、HTTP方法,以及所请求的URL。

例子编辑 播报

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

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

A = Hash(nonce, password);

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

  • nonce 仅仅被使用一次,
  • 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 防止了预计算表的生成。

参考文章:Nonce

有一些细节部分还是不太懂。。。回头有时间再研究。。。。

nonce值是什么?(Number once)(Number used once)cnonce(client nonce)(一个只被使用一次的任意或非重复的随机数值)相关推荐

  1. 通过修改mateMask的nonce值修复replacement transaction underpriced的问题

    今天通过mateMask转账遇到了如下报错 [ethjs-query] while formatting outputs from RPC '{"value":{"cod ...

  2. pandas使用nunique函数计算dataframe每个数据列的独特值的个数(count number of unique values in each column of dataframe)

    pandas使用nunique函数计算dataframe每个数据列的独特值的个数(count number of unique values in each column of dataframe) ...

  3. Number.parseInt(), Number.parseFloat()

    Number.parseInt(), Number.parseFloat() ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变. // E ...

  4. oracle number +1,number number(1)

    测试如下: create table test123 (a number,b number(1)) insert into test123 values (1,1) insert into test1 ...

  5. 263.Ugly Number||202 happy number||476 Number Complement||136 Single Number

    263.Ugly Number 判断因数是否只有素数2.3.5.. 感觉比较简单: class Solution(object):def isUgly(self, num):""& ...

  6. Number、Number()和new Number()

    今天周测出现了一道题是判断数据的数据类型,一开始的时候没有往深处想,就想到了表面,主要是没有把Number.Number()和new Number()理解透.在网上找了几篇关于这个的文章,刚开始晕晕的 ...

  7. 【PyTorch】torch.clamp()==>将input的值限制在[min, max]之间,并返回结果到一个新张量

    函数定义: torch.clamp(input, min, max, out=None) 作用:限幅.将input的值限制在[min, max]之间,并返回结果到一个新张量 参数: input (Te ...

  8. [JS]请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

    请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组. 刚开始复习js题还不太习惯 CSDN上看了一个帖子,说是牛客上的标答, ...

  9. pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值、groupby.nth函数获取每个组中的最后一个值

    pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值.groupby.nth函数获取每个组中的最后一个值 目录

最新文章

  1. XWiki 4.3 正式版发布
  2. 【译】理解Javascript函数执行—调用栈、事件循环、任务等
  3. 英文谚语:Take that with a grain of salt
  4. 一个简单RPC框架是怎样炼成的(II)——制定RPC消息
  5. Promise.race 的原理
  6. 在学习Python基础中需要知道的知识点:运算符大全,收藏,以后方面查询(算术运算符、赋值运算符、比较运算符、位运算符、逻辑运算符、成员运算符、身份运算符、运算符优先级))
  7. 【已解决】tomcat报严重: Socket accept failed
  8. 命令界面:使用Java中的动态API处理Redis
  9. 我是如何把30000行代码重构成15行
  10. 【AD18】原理图生成PDF
  11. PX4Flow使用操作
  12. 工业机器人电柜布线_工业机器人示教器及其连线图
  13. Vue项目搭建常用的配置文件,request.js和vue.config.js
  14. 导弹发射各项参数计算涉及计算机应用,按计算机用途分类
  15. Android Snackbar控件
  16. 将tif文件转换成mrc文件
  17. 微信小程序API 文件·文件管理器
  18. 计算机联锁验证实训报告心得,计算机实训心得体会(通用5篇)
  19. linux格式化分区4t硬盘,Linux下挂载4T大小usb硬盘的经历
  20. 使用 IndexedDB 进行大数据存储

热门文章

  1. 模拟喷泉码(入门二):Seamless Rate Adaptation for Wireless Networking
  2. Python学习笔记(1)---B站黑马程序员
  3. 前端入门 1| HTML基本结构
  4. 小白也能看懂的零信任SDP介绍
  5. [Perl]如何取绝对路径:FindBin模块和Cwd模块用法和区别
  6. PowerDesigner如何导出表到word的方法
  7. Windows 下 android自动打包 volley项目
  8. 友盟对android的应用,Android 集成友盟统计
  9. 实验一 常用仪器与门逻辑电路实验
  10. 在ReactJS中正确修改状态数组