OpenSSL 3.2.0新增Argon2支持——防GPU暴力攻击
1. 引言
OpenSSL新发布的3.20版本中,引入了一些新特性,包括:
- post-quantum方法
- Brainpool曲线
- QUIC
- Argon2:Argon2 是一种慢哈希函数,在 2015 年获得 Password Hashing Competition 冠军,利用大量内存计算抵御 GPU 和其他定制硬件的破解,提高哈希结果的安全性。
- 等等

Argon2开源实现见: - https://github.com/P-H-C/phc-winner-argon2(C)
Argon2: the memory-hard function for password hashing and other applications 由Alex Biryukov、Daniel Dinu 和 Dmitry Khovratovich 设计,为密钥派生函数(KDF,Key Derivation Function),可用于:
- 创建密码的哈希值
- 基于密码创建加密密钥
- 2015年7月获得 Password Hashing Competition 冠军
- 可抵抗GPU和侧道攻击。
Argon2利用大量内存和大量计算资源进行 Hash 计算,有三个变种:
- 1)Argon2i:Argon2i使用独立于数据的内存访问,这是密码散列和基于密码的密钥派生的首选方法,但速度较慢,因为它会在内存中进行更多的传递,以防止受到折衷攻击。
- 2)Argon2d:Argon2d是比较快的,被用于数据依赖的内存访问,这使得它对GPU破解攻击具有很高的抵抗力,适用于不受侧信道攻击威胁的应用程序(如加密货币)。
- 3)Argon2id:Argon2id是Argon2i和Argon2d的混合体,使用依赖于数据和独立于数据的内存访问的组合,这使Argon2i能够抵抗侧通道缓存计时攻击,并使Argon2d能够抵抗GPU破解攻击。
Argon2i、Argon2d和Argon2id之间通过参数区分:
- A time cost, which defines the amount of computation realized and therefore the execution time, given in number of iterations
- A memory cost, which defines the memory usage, given in kibibytes
- A parallelism degree, which defines the number of parallel threads
2. Password
Password 是 Web 服务主要的认证方式之一。
Password 一般以 Hash 后的形式存储在数据库中。这些数据库如果被拖库,使用 Dictionary Attack 可以轻松破解,因为他们的熵很低。相同的密码会被不同的用户使用或同一个用户在不同系统中使用。
为了解决这个问题,设计者在密码 Hash 的过程里加入了 salt。
Dictionary Attack 一个字典文件,储存了单词、短语、常用密码和他们 hash 后结果。将密码与 hash 结果对比,就能破解[2]。
Brute Force Attack 尝试每一个给定长度下的字符组合,效率很低。
加盐已经可以解决大部分问题,但无法阻止 Brute Force Attack,借助 GPU、FPGA、ASIC 等定制硬件可以非常低成本的进行 Hash 计算。此外,如果 salt 和 password 被一起被拖库(甚至代码),会使得破解成本更加低。
这里核心的问题是,Hash 方法使用的是无内存计算的,而 GPU、ASIC 等硬件可以让无内存计算变得非常高效。但是,当一个 Hash 方法需要用到一大块内存去计算的时候,这些硬件就会束手无策。所以 memory-hard hash function 开始被设计和使用。
Memory-hard hash function 也可以被用在加密货币的工作量证明中,用来压制 GPU 和 ASIC 在加密货币中的滥用。例如 scrypt 被用作莱特币的工作量证明算法。
当今,8个(小写)字母的密码,可在10秒内暴力破解。若使用9个(小写)字母的密码,则可在10分钟内破解。若只是在密码末尾添加一个数字或让首字母大写,对破解速度几乎无影响。具体见Calculate Passwords。
Argon2是抗GPU攻击的,同时具有内存开销。其开销包括:
- 执行时长:CPU开销
- 所需内存:内存开销
- degree of parallelism并行度:以 p p p来表示
Argon2的参数有:
- Password §: Defines the password bytes to be hashed
- Salt (S): Defines the bytes to be used for salting.
- Parallelism §: Defines the number of threads that are required for the parallelism.
- TagLength (T): Define the number of bytes to return for the hash.
- MemorySizeKB (m): Amount of memory (in KB) to use.
具体的bench性能为:【其中 n n n用于time cost, p p p用于parallelism, m m m为message】

由上图可发现:
- 当 n = 128 n=128 n=128时,计算哈希值用时为0.105秒,即每秒可做10次哈希运算。
- 当 n = 8192 n=8192 n=8192时,计算哈希值用时为5.78秒,这个时间对用户登录来说有点过长。
实际使用时,应选择哈希计算时长合理,且抵抗攻击足够强健的参数。
OpenSSL Argon2指令示例:
Command: openssl kdf -keylen 24 -kdfopt pass:Hello -kdfopt salt:NaCl1234 -kdfopt iter:1 -kdfopt memcost:8 ARGON2IPassword: Hello
KDF: ARGON2
Salt: NaCl1234
Length: 24
Iterations: 1
Memcost: 8
-----------------
ARGON2I
7E:C8:58:7D:85:96:F6:9C:5A:13:F3:78:27:7C:DC:D5:FA:28:FF:B4:EC:C8:2F:00
ARGON2D
BB:13:EE:29:A3:38:95:D4:C5:81:5A:1B:0B:05:48:0E:22:53:F1:3F:13:12:16:F7
ARGON2ID
07:65:6A:7F:16:81:C8:85:39:68:0E:F4:64:92:2A:38:CE:7E:71:83:DE:72:39:0D
参考资料
[1] Prof Bill Buchanan OBE 2023年11月博客 An Early Cybersecurity Christmas Present From OpenSSL: Some Argon
[2] Argon2算法简介
相关文章:
OpenSSL 3.2.0新增Argon2支持——防GPU暴力攻击
1. 引言 OpenSSL新发布的3.20版本中,引入了一些新特性,包括: post-quantum方法Brainpool曲线QUICArgon2:Argon2 是一种慢哈希函数,在 2015 年获得 Password Hashing Competition 冠军,利用大量内存计算抵…...
数据结构--稀疏矩阵及Java实现
一、稀疏 sparsearray 数组 1、先看一个实际的需求 编写的五子棋程序中,有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据.->稀疏数组。 2、稀疏数组基本介绍 当一个数组中大部分元素为0…...
关于GPU使用过程中的若干问题
1.CUDA异常 问题描述:运行torch.cuda.is_available() 报错:cuda unknown error - this may be due to an incorrectly set up environment解决方案:重启 2.nvidia驱动版本不匹配 问题描述:运行nvidis-smi 报错:Fa…...
spring之面向切面:AOP(2)
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...
【开题报告】基于uniapp的家庭记账小程序的设计与实现
1.研究背景 随着社会经济的发展和人们生活水平的提高,家庭财务管理变得越来越重要。家庭记账是一种重要的财务管理方式,通过记录和分析家庭的收入和支出情况,可以帮助家庭成员更好地理解和掌握自己的财务状况,合理规划和管理家庭…...
HTML5面试题
HTML5面试题 什么是HTML5?它与HTML4有何不同之处? HTML5是HTML的第五个主要版本,它引入了许多新的语义化元素、API和功能,以改进网页的结构、样式、交互和多媒体体验。 HTML5与HTML4的不同之处包括: 引入了一系列新的语…...
树莓派通过网线连接电脑并且设置设置链接wifi
好久没玩过树莓派了,系统进不去了,需要记录一下,之前总觉得自己会了,但是还是需要不断的翻阅资料。 树莓派 配置SD卡开启ssh - 哔哩哔哩 树莓派通过网线连接ssh 直接在sd卡建立一个ssh的文件,不要带任何后戳 ip查…...
C#拼接JSON
一、业务背景 最近项目需要与U8c对接,实现增删改查,借此机会,梳理一下C#解析Json字符串的问题。 这篇文章,先以新增接口为例。 二、新增接口 查看需要传入的json格式。 拼接json,无非就是{}和[]的来回嵌套。 首先&am…...
评价机器学习模型的指标
为了衡量一个机器学习模型的好坏,需要给定一个测试集,用模型对测试集中的每一个样本进行预测,并根据预测结果计算评价分数。 对于分类问题,常见的评价标准有准确率、精确率、召回率和F值等。给定测试集 𝒯 {(…...
C# WPF上位机开发(日志调试)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 程序开发的过程中,调试肯定是少不了的。比如说,这个时候,我们可以设置断点、查看变量、检查函数调用堆栈等等。…...
AR室内导航如何实现?技术与原理分析
随着科技的进步,我们生活中许多方面正在被重新定义。其中之一就是导航,尤其是室内导航。增强现实(AR)技术的出现为室内导航带来了革命性的变革。本文将深入探讨AR室内导航的技术与原理,以及它如何改变我们的生活方式。…...
计算机网络:物理层(奈氏准则和香农定理,含例题)
带你速通计算机网络期末 文章目录 一、码元和带宽 1、什么是码元 2、数字通信系统数据传输速率的两种表示方法 2.1、码元传输速率 2.2、信息传输速率 3、例题 3.1、例题1 3.2、例题2 4、带宽 二、奈氏准则(奈奎斯特定理) 1、奈氏准则简介 2、…...
天津仁爱学院专升本化学工程与工艺专业 《无机化学》考试大纲
天津仁爱学院化学工程与工艺专业高职升本入学考试《无机化学》课程考试大纲 一.参考教材 杨宏孝《无机化学简明教程》以及《无机化学简明教程学习指南》,高等教育出版社,2011年版。 二.考试基本要求 本考试要求将《无机化学》…...
GO 的 socks5代理 编写
这里学习一下 socks5 代理的编写 网上有很多 学习一下 go 语言实战入门案例之实现Socks5 - 知乎 滑动验证页面 socks5协议原理学习-腾讯云开发者社区-腾讯云 (tencent.com) 首先我们要了解一下socks5的代理方式 socks5 是基于 认证建立连接转发数据 所形成的代理 我们只…...
MYSQL-简单的联表查询示例
假设我们有两个表,一个是users表,包含用户的ID和姓名;另一个是orders表,包含订单的ID、用户ID和订单金额。我们想要关联这两个表,查询出每个用户的订单总金额。 首先,我们可以使用以下SQL查询获取每个用户…...
Python基于joblib的并行计算进程线程multiprocessing多核并行计算
文章目录 Python基于joblib的并行计算适用场景使用示例总结爬虫&joblib使用`joblib`的场景注意事项使用实例结论joblib介绍简单示例多参数并行并行时CPU是怎么分配的何时选用并行进程&线程进程和线程之间的关系...
左右列的单元格合并
EasyExcel导出合并单元格,左右列的单元格合并 1、导出的实体类,也就是表头 Data public class CityCapacityPo {ExcelProperty(value "时间",index 0)private String time;ExcelProperty(value "出口",index 1)private String …...
机器学习 | 决策树 Decision Tree
—— 分而治之,逐个击破 把特征空间划分区域 每个区域拟合简单模型 分级分类决策 1、核心思想和原理 举例: 特征选择、节点分类、阈值确定 2、信息嫡 熵本身代表不确定性,是不确定性的一种度量。 熵越大,不确定性越高,…...
面试题总结(十四)【系统移植】【华清远见西安中心】
你用过哪些Bootloader?有什么区别? 作为一个AI助手,我没有直接使用过Bootloader。但我可以为您提供一些关于常见Bootloader的信息和他们之间的区别。 1. GRUB (GRand Unified Bootloader):GRUB是一个功能强大且广泛使用的Bootload…...
【Spark精讲】Spark RDD弹性体现在哪些方面?
什么是“弹性”? 一般对于分布式系统,“弹性”指的是可以根据计算规模进行动态伸缩的特性。当计算量增长时,可以动态增加资源来满足计算需求,而当计算量减少时,又可以降低资源配置来节约成本。 参考:什么是…...
Swift集成飞书API:使用feishu-swift SDK构建高效机器人
1. 项目概述:一个连接飞书与Swift生态的桥梁 最近在折腾一个内部工具,需要把服务端的一些数据变动实时同步到飞书群里,方便团队同学及时跟进。服务端是用Swift写的,而飞书官方虽然有开放的API,但直接上手去调…...
TypeScript代码质量扫描利器tscanner:超越tsc的类型安全检查实践
1. 项目概述:一个被低估的TypeScript代码质量扫描利器最近在重构一个遗留的TypeScript项目,代码库已经膨胀到几十万行,各种any满天飞,类型定义混乱不堪,手动审查根本无从下手。就在我头疼的时候,同事推荐了…...
Agent = Model + Harness
Agent Model Harness从通用视角拆解 Agent 的完整工程链路。本文不做框架对比,只回答一个问题:Agent 真正的工程在哪里? 读完应当能在自己的 Agent 实现里识别出对应的层次,并判断哪一段最值得优化。图 0 全链路总览࿱…...
Wand-Enhancer终极指南:3步免费解锁WeMod Pro高级功能的完整方案
Wand-Enhancer终极指南:3步免费解锁WeMod Pro高级功能的完整方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费…...
AI技能库实战:模块化设计赋能博客创作自动化工作流
1. 项目概述:一个面向AI时代的博客技能开源库最近在GitHub上闲逛,发现了一个挺有意思的项目,叫inblog-inc/inblog-ai-skills。光看这个名字,就透着一股子“务实”的味道。它不是又一个教你如何调参炼丹的AI模型库,也不…...
如何用Python快速接入Taotoken平台调用多模型API
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken平台调用多模型API 对于希望快速体验不同大模型能力的开发者而言,逐一对接各家厂商的API…...
一个开发团队的时序数据库选型实战手记
当实验室的模拟数据,遇上真实产线上轰鸣的机器与错综复杂的业务逻辑,我们才发现:选择一款数据库,远不止比拼性能数字那么简单。历时半年选型、三个月上线,本文将完整复盘我们从InfluxDB、TDengine到最终落地金仓KES时序…...
从零到一:Ubuntu Server上构建生产级Slurm计算集群
1. 环境准备与系统配置 在开始构建Slurm集群之前,我们需要确保所有节点都处于干净、一致的初始状态。我建议使用Ubuntu Server 22.04 LTS版本,这个长期支持版本经过充分测试,稳定性有保障。实际部署中发现,不同Linux发行版间的软件…...
基于CircuitPython与BLE构建多探头无线温度监测系统
1. 项目概述:一个无线温度监控的“瑞士军刀” 如果你和我一样,喜欢在周末慢烤一块牛排,或者沉迷于培养天然酵母做面包,那你一定理解同时盯着好几个温度计的烦恼。厨房里烟雾缭绕,烤箱里正烤着东西,发酵箱里…...
微内核操作系统nanoclaw:面向嵌入式与边缘计算的极简设计
1. 项目概述:一个为嵌入式与边缘计算而生的微型操作系统最近在折腾一些资源极其有限的嵌入式板子,比如只有几十KB内存的MCU,或者那些主打低功耗的边缘计算节点。在这些场景下,跑一个完整的Linux系统简直是天方夜谭,而传…...
