摘要:在当今的数字世界中,密码安全是至关重要的。为了保护用户密码免受未经授权的访问和破解,Password-Based Key Derivation Function 2 (PBKDF2)算法成为了一种重要的工具。

在 PBKDF2 算法中,SHA 表示 Secure Hash Algorithm,它是一系列密码哈希函数的标准,其中 SHA-1、SHA-256、SHA-384 和 SHA-512 等是常见的版本。因此,PBKDF2-SHA 就是使用 SHA 系列算法作为其内部哈希函数的密码派生函数。

PBKDF2-SHA 算法的工作原理是通过多次迭代将输入的密码和盐值进行混合和计算,以生成一个安全的密钥。这样设计可以增加攻击者破解密码所需的时间和资源成本,提高密码的安全性。

PBKDF2算法的优点

PBKDF2算法具有以下优点:

2.1. 密码安全性提升

PBKDF2算法通过迭代应用一个伪随机函数来增加密码的安全性。这种迭代过程使得破解者需要更多的计算资源和时间来破解密码,从而大大增加了密码的安全性。

2.2. 强大的密钥派生功能

PBKDF2算法可以根据用户提供的密码和盐值生成一个强大的密钥。这个密钥可以用于加密和解密数据,同时也可以用于生成消息验证码等。

2.3. 可扩展性和灵活性

PBKDF2算法可以根据需要进行迭代次数的调整,以适应不同的安全需求。这使得算法具有较高的灵活性,并可以根据应用程序的要求进行调整。

3. PBKDF2算法的缺点

尽管PBKDF2算法具有许多优点,但也存在一些缺点:

3.1. 计算资源消耗较高

由于PBKDF2算法需要进行多次迭代,因此它对计算资源的消耗相对较高。这可能会对一些资源有限的设备或系统造成一定的负担。

3.2. 不适合高速加密需求

由于PBKDF2算法的计算量较大,它在高速加密需求的场景下可能表现不佳。对于这些场景,可以考虑使用更高效的密钥派生函数。

4. PBKDF2算法的应用

PBKDF2算法主要应用于密码存储和验证过程中。它解决了以下问题:

4.1. 密码泄露的风险

通过将用户密码转换为密钥,PBKDF2算法可以大大降低密码泄露的风险。即使攻击者获取了存储的密码数据,他们也无法轻易地破解出原始密码。

4.2. 弱密码的安全性

PBKDF2算法可以增加弱密码的安全性。通过迭代和盐值的引入,即使用户选择了弱密码,破解者也需要付出更大的代价才能破解密码。

在keycloak中的应用

在使用 PBKDF2-SHA256 算法进行密码哈希时,通常会将生成的盐值和哈希后的密码一起存储在数据库中。当用户下次输入相同的明文密码时,您需要按照以下步骤来对比用户输入的密码与库里存储的密码是否相同:

  1. 从数据库中获取该用户的盐值和已经哈希后的密码。
  2. 使用获取到的盐值和用户输入的明文密码,结合 PBKDF2-SHA256 算法再次计算哈希值。
  3. 将上一步得到的哈希值与数据库中存储的哈希密码进行比较。
  4. 如果两个哈希值相同,则说明用户输入的密码是正确的;如果不同,则密码不匹配。

简而言之,您需要在用户登录时重新计算哈希值,并将其与数据库中存储的哈希密码进行比较以验证用户身份。这样设计可以保证用户密码的安全性,同时也能够防止彩虹表攻击等恶意破解手段。

PBKDF2工具类

/**
* PB KDF2 SHA工具类
*
* @author lind
* @date 2024/5/8 8:20
* @since 1.0.0
*/
public class PBKDF2SHAUtils { private static final String PBKDF_2_WITH_HMAC_SHA_512 = "PBKDF2WithHmacSHA512"; private static final int ITERATIONS = 30000; private static final int DERIVED_KEY_SIZE = 256; /**
* PB KDF2 SHA256加密
* @param rawPassword
* @param salt
* @return
*/
public static String encodedCredential(String rawPassword,byte[] salt){
return encodedCredential(rawPassword, ITERATIONS,salt, DERIVED_KEY_SIZE);
}
// 加密
public static String encodedCredential(String rawPassword, int iterations, byte[] salt, int derivedKeySize) {
KeySpec spec = new PBEKeySpec(rawPassword.toCharArray(), salt, iterations, derivedKeySize); try {
byte[] key = getSecretKeyFactory().generateSecret(spec).getEncoded();
return new String(Base64.getEncoder().encode(key));
}
catch (InvalidKeySpecException e) {
throw new RuntimeException("Credential could not be encoded", e);
}
catch (Exception e) {
throw new RuntimeException(e);
}
} // 随机盐
public static byte[] getSalt() {
byte[] buffer = new byte[16];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(buffer);
return buffer;
} private static SecretKeyFactory getSecretKeyFactory() {
try {
return SecretKeyFactory.getInstance(PBKDF_2_WITH_HMAC_SHA_512);
}
catch (NoSuchAlgorithmException e) {
throw new RuntimeException("PBKDF2 algorithm not found", e);
}
} }

单元测试代码

@Test
public void generatePassword() {
String rawPassword = "123456";//原密码
byte[] salt = PBKDF2SHAUtils.getSalt();// 随机盐,需要存储
String encodePass = PBKDF2SHAUtils.encodedCredential(rawPassword, salt);// 秘文,需要存储
System.out.println("encodePass:" + encodePass);
String formData = "123456"; // 表单数据
Assert.equals(encodePass, PBKDF2SHAUtils.encodedCredential(formData, salt));// 与库里密码对比 }

算法~PBKDF2-SHA让密码更安全的更多相关文章

  1. 使用BCrypt算法加密存储登录密码用法及好处

    //导入import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** *使用BCrypt算法加密存储登录密码 ...

  2. Spring Security笔记:使用BCrypt算法加密存储登录密码

    在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号.密码”存储在db中,但是密码都是明文存储的,显然不太讲究.这一节将学习如何使用spr ...

  3. 散列算法-SHA

    一种生成信息摘要的算法.主要用于数据一致性和完整性的校验 SHA算法分很多版本,最大的分类是SHA-1和SHA-2.SHA-2包括很多子版本,SHA-224,SHA-256,SHA-384,SHA-5 ...

  4. 算法笔记_225:数字密码发生器(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如 ...

  5. 利用WordPress用户密码算法规则修改用户密码

    WordPress用户密码保存在wp_users数据表的user_pass字段,密码是通过Portable PHP password hashing framework类产生的, 密码的形式是随机且不 ...

  6. 如何生成安全的密码 Hash:MD5, SHA, PBKDF2, BCrypt 示例

    密码 Hash 值的产生是将用户所提供的密码通过使用一定的算法计算后得到的加密字符序列.在 Java 中提供很多被证明能有效保证密码安全的 Hash 算法实现,我将在这篇文章中讨论其中的部分算法. 需 ...

  7. Android逆向之旅---Android中锁屏密码算法解析以及破解方案

    一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机 ...

  8. Kali配置gmssl密码算法库

    Kali配置gmssl密码算法库 一.密码算法库的下载 https://github.com/guanzhi/GmSSL/releases 二.安装配置 1 解压 把刚刚下载的GmSSL 3.0.0. ...

  9. Python常见加密解密算法

    Python爬虫常见加密解密算法 url encode加密 简介:当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback) ,需要 ...

  10. GJM : 使用浏览器的计算力,对抗密码破解 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. KingbaseES 名词解释之timeline

    timeline定义 每当归档文件恢复完成后,创建一个新的时间线用来区别新生成的WAL记录.WAL文件名由时间线和日志序号组成 引入timeline的意义 为了理解引入时间线的背景,我们来分析一下,如 ...

  2. archlinux xfce修改桌面字体颜色

    参照 https://forums.linuxmint.com/viewtopic.php?t=341804 1.大于等于4.14的版本则在主文件夹的 .config 文件夹 gtk-3.0 中,创建 ...

  3. [AHOI2014/JSOI2014/一本通1722]骑士游戏 题解 (spfa做dp)

    题目描述 在游戏中,JYY一共有两种攻击方式,一种是普通攻击,一种是法术攻击.两种攻击方式都会消耗JYY一些体力.采用普通攻击进攻怪兽并不能把怪兽彻底杀死,怪兽的尸体可以变出其他一些新的怪兽,注意一个 ...

  4. 医疗BI系统如何使医疗行业完成精细化管理转型?

    不久前在北京召开的全国医疗管理工作会议,确定了今年的医疗管理工作重点.会议强调,推动医疗管理改革工作的过程中要对形势.规律准确把握,积极应对可能面临的挑战,以"三个转变.三个提高" ...

  5. mask2former出来的灰度图转切割轮廓后的二值图

    切割后的灰度图 转成二值图代码如下 点击查看代码 # This is a sample Python script. import cv2 import numpy as np # Press Shi ...

  6. 第一篇:Python入门基础

    主要内容 1.Python简介 2.变量 3.字符编码 4.用户交互 5.if 流程判断 6.while循环 7.for循环 一.Python简介 1.python的创始人为吉多·范罗苏姆(Guido ...

  7. nginx重新整理——————http请求的11个阶段中的find_config[十三]

    前言 简单介绍一下find_config 与 preaccess 阶段. 正文 find_config 很大一部分工作是进行location的匹配. 来一张图看下location指令和merge_sl ...

  8. spring boot @propertySource @importResource @Bean [六]

    @propertySource 指定property的配置源. 创建一个person.property: 然后修改person注解; 在运行test之后,结果为: @importResource 这个 ...

  9. ionic 4 app 自动版本更新

    前言 介绍一下ionic4 app的自动更新.ionic 不多介绍了,后面一个后系列,背负着骂名的ionic其实还是可以的,如果刚入门ionic可能觉得很坑,但是呢,往后你就发现另外一件事,那就是其他 ...

  10. 什么是ip协议一

    前言 两节结束,为网络底层系列做铺垫. 首先来看一张图: IOS有七层,但是我们可以简化层4层,ip属于传输层,可以说是非常重要,下面简单的做一个介绍. 正文 ip的介绍: 1.ip是tcp/ip 协 ...