首页 > 其他分享 >[转][译] 密码哈希的方法:PBKDF2,Scrypt,Bcrypt 和 ARGON2

[转][译] 密码哈希的方法:PBKDF2,Scrypt,Bcrypt 和 ARGON2

时间:2023-12-25 14:45:35浏览次数:27  
标签:加密 Argon2 PBKDF2 ARGON2 内存 哈希 Scrypt Bcrypt

密码哈希的方法:PBKDF2,Scrypt,Bcrypt 和 ARGON2

关于如何安全的存储密码以及使用何种算法总是有很多的争论:MD5、SHA1,SHA256、PBKDF2,Bcrypt、Scrypt、Argon2、明文??

因此,我试图分析并总结了最新的合理选择:Scrypt、Bcrypt 和 Argon2 是符合条件的,MD5、SHA1、SHA256 就不太适合存储密码!

 

 

总结

在 2015 年,我就已经发布了‘密码哈希:PBKDF2、Scrypt、Bcrypt’文章,来作为对朋友问题的延伸回答。

概括的说:

攻击者通常拥有与我们不同的、更专业(强大)的硬件
攻击者之所以使用专业的硬件,是因为它能根据某些算法进行定制,定制化的硬件允许某些算法能比非专业硬件(CPU)上运行的更快,而且 —— 总体而言 —— 某些算法还可以并行化;
我们依赖慢哈希方法来对密码进行哈希,从而实现你采用的 CPU/GPU 处理器与攻击者的 GPU/FPGA/ASIC 处理器在计算能力上处于同一水准。

以上这些都是正确的,然而,数字加密货币的竞争又上升到另一个层面:数十亿美元的市值, 基于软件/硬件,以最快的速度来实现一种数字加密货币的底层算法,这相比于其他矿工来说也是一种优势,因此,也是最赚钱的一个。

在比特币使用 SHA256 来作为其底层加密方法的时候(因此,可以在已经优化的硬件上对其进行极大的优化,使其对矿工来说成为一种‘不公平’的数字货币),但其他加密货币的创建者试图通过依赖内存的方法来使新的数字加密货币能被更加公平的开采:莱特币Scrypt) 是早期的示例,ZcashEquihash)是最近的示例。

这意味着用于密码哈希的慢方法正在被用来保护数百万甚至数十亿美元市值的数字加密货币,这使得慢哈希方法的最快实现是有意义的,而且通常这也是公开可用的

那么今天什么是安全的呢?

原理还是一样的:我们需要一个加密社区审核过的慢函数并且依然未被破解。

PBKDF2 已经存在很长时间了,像之前文章讨论的一样,它有点过时了:轻松的在多核系统(GPU)上实现并行,这对于定制系统(FPGA/ASIC)来说微不足道。所以我拒绝了它。

虽然在 1999 年 BCrypt 就产生了,并且在对抗 GPU/ASIC 方面要优于 PBKDF2,但是我还是不建议你在新系统中使用它,因为它在离线破解的威胁模型分析中表现并不突出。 尽管有一些数字加密货币依赖于它(即:NUD),但它并没有因此获得较大的普及,因此,FPGA/ASIC 社区也并没有足够的兴趣来构建它的硬件实现。 话虽如此,Solar Designer(OpenWall)、Malvoni 和 Knezovic(萨格勒布大学)在 2014 年撰写了一篇论文,这篇文章描述了一种混合使用 ARM/FPGA 的单片系统来攻击该算法。

SCrypt 在如今是一个更好的选择:比 BCrypt设计得更好(尤其是关于内存方面)并且已经在该领域工作了 10 年。另一方面,它也被用于许多加密货币,并且我们有一些硬件(包括 FPGA 和 ASIC)能实现它。 尽管它们专门用于采矿,也可以将其重新用于破解。

Argon2

写完我的第一篇文章后不久,Argon2 在 2015 年 7 月赢得了密码哈希竞赛。

密码哈希竞赛

该竞赛于 2012 年秋季启动,2013 年第一季度,竞赛委员会发布了征集参赛作品的通知,截止日期为 2014 年 3 月底。作为比赛的一部分,小组成员对提交的参赛作品进行了全面审核,并发布了一份初步的简短报告,其中描述了他们的选择标准和理由。

介绍

Argon2 有两个主要的版本:Argon2i 是对抗侧信道攻击的最安全选择,而 Argon2d 是抵抗 GPU 破解攻击的最安全选择。

源代码可以在 Github 上获得,使用兼容 C89 的 C 语言编写,并在知识共享许可协议下获取许可,并且可以在大多数 ARM、x86 和 x64 架构的硬件上编译。

基于 AES 实现

Argon2 基于 AES 实现,现代的 x64 和 ARM 处理器已经在指令集扩展中实现了它,从而大大缩小了普通系统和攻击者系统之间的性能差距,

参数调整

两个版本的算法都可以实现参数化:

  • 时间开销,它定义了执行的时间
  • 内存开销,它定义了内存的使用情况
  • 并行程度,它定义了线程的数量

这意味着你可以分别调整这些参数,并根据你的用例、威胁模型和硬件规范来量身定制安全约束。

权衡攻击

除此之外,Argon2 尤其能抵挡排名权衡攻击,这使得在现场可编程逻辑门阵列上进行低成本攻击变得更加困难:虽然,最近的现场可编程逻辑门阵列已经嵌入 RAM 区块,但是,内存带宽仍然是一个限制,并且为了减少内存带宽要求,攻击者必须为了 Argon2 使用更多的计算资源。

规范(见第 5 章)和同一作者的另外一篇文章中讨论了这些攻击手段和相似的攻击手段,并将其与 scrypt 进行比较。

Argon2id

以下是来自 Argon2 互联网工程任务组草案的引用/释义。

Argon2d 使用依赖数据的内存访问,这使得它很适合用于加密数字货币和工作量证明的应用程序,而不会受到侧信道定时攻击的威胁。Argon2i 使用与数据无关的内存访问,这是密码哈希的首选方法。Argon2id 在内存第一次迭代的前半部分充当 Argon2i,其余部分则充当 Argon2d。因此,基于时间 —— 空间的平衡,它既提供了侧信道攻击保护也节约了暴力开销。Argon2i 对内存进行了更多的传递,以防止权衡攻击的发生。

 

 

如果你担心侧信道攻击(例如:恶意数据缓存加载/幽灵漏洞,它允许通过基于缓存的侧信道读取同一硬件上其他正在运行的进程的私有内存数据),你应该使用 Argon2i,否则使用 Argon2d。 如果你不确定或你对混合方法感到满意,你可以使用 Argon2id 来获得两个方面的优势。

结论

在 2019 年,我建议你以后不要使用 PBKDF2 或 BCrypt,并强烈建议将 Argon2(最好是 Argon2id)用于最新系统。

Scrypt 是当 Argon2 不可用时的不二选择,但要记住,它在侧侧信道泄露方面也存在相同的问题。

标签:加密,Argon2,PBKDF2,ARGON2,内存,哈希,Scrypt,Bcrypt
From: https://www.cnblogs.com/dirgo/p/17926053.html

相关文章

  • [转]PBKDF2函数,比「Hash加盐」更好的口令保护方案
    原文地址:PBKDF2函数,比「Hash加盐」更好的口令保护方案-简书在前面两篇文章中,对用户口令进行加密的方式其实称为Password-basedencryption(PBE),算法实现很简单,那是不是有更好和更标准的PBE实现呢?基于Hash+salt的算法最大的问题在于Hash函数的运算太快了,虽然加盐让......
  • 安装mongo提示报错libcrypto.so.1.1解决方法
    1、输入网址:www.openssl.org第一种下载:点击Downloads→点击要下载的openssl然后解压:tar-zxvfopenssl.x.x.xx.tar.gz第二种下载:wgethttps://www.openssl.org/source/openssl-1.1.1w.tar.gz解压:tar-zxvfopenssl-1.1.1w.tar.gz切换到解压好的目录:cdopenssl-1.1.1w编译安装:./conf......
  • Go - two bcrypt hashes of the same password are NOT equal
     packagemainimport("fmt""golang.org/x/crypto/bcrypt")funcmain(){password:="abcdef"hashedPassword1,_:=bcrypt.GenerateFromPassword([]byte(password),bcrypt.DefaultCost)fmt.Println(strin......
  • 深入了解PBKDF2加密技术:原理与实践
    摘要:本文详细介绍了PBKDF2(Password-BasedKeyDerivationFunction2)加密技术,包括其原理、算法流程和实际应用,旨在帮助读者更好地理解这一重要的加密方法。PBKDF2在线加密--一个覆盖广泛主题工具的高效在线平台(amd794.com)https://amd794.com/pbkdf2一、引言在当今数字时......
  • php:bcrypt加密和验证(php 8.1)
    一,相关文档:https://www.php.net/manual/zh/function.password-hash.php二,php代码:12345678910111213141516171819202122232425/* *测试用bcrypt方式验证密码 *用password_hash和password_verify一对函数实现 **/publicfunct......
  • 账号加密算法哪家强?BCryptPasswordEncoder
    引言在项目开发过程中,注册时需要向数据库写入用户账号信息,其中主要包括用户名和密码。那么,密码你是明文显示还是经过加密了呢?如果直接明文显示,在数据库中可以直接查看用户密码;如果经过加密,则数据库中无法直接获取用户密码。很显然,密码采用明文的方式实在是太不安全了。一方面......
  • samtools: error while loading shared libraries: libcrypto.so.1.0.0: cannot open
     001、问题:conda安装samtools后调用出现如下报错:samtools:errorwhileloadingsharedlibraries:libcrypto.so.1.0.0:cannotopensharedobjectfile:Nosuchfileordirectory 002、解决方法(base)[root@pc1home]#find~-name"libcrypto.so.1*"##......
  • 使用BCryptPasswordEncoder类实现数据库密码的加密---简单极了的那种
    1、存储加密的密码,实现数据库加密的操作BCryptPasswordEncoderbCryptPasswordEncoder=newBCryptPasswordEncoder();Stringencode=bCryptPasswordEncoder.encode(password);Useruser=newUser();user.setPassword(encode);2、读取比对数据库信息......
  • MD5 or Bcrypt?
    MD5orBcrypt?摘要首先是一个错误的认识观念问题,很多人觉得MD5是一个加密算法。不然,他实则是一种摘要算法,也可以叫哈希函数。他的作用是将目标文本转换成具有相同长度、不可逆的杂凑字符串。而加密算法和他恰恰相反,是将目标转换成具有不同长度、可逆的密文。MD5简介一般来......
  • Bcrypt加密算法相关
    简介Bcrypt是一个跨平台的文件加密工具,由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。spring-security内部就是使用这个算法来对用户密码加密的(BCryptPasswordEncoder)。使用maven依赖<dependency><......