算法~PBKDF2-SHA让密码更安全

pbkdf2,sha · 浏览次数 : 0

小编点评

**摘要** 本文介绍了密码安全中的 PBKDF2 算法,它是一种用于密码安全的算法,可以增强用户密码的安全性。 **主要内容** * PBKDF2 算法是一种迭代密码哈希函数,可以用于生成安全的密钥。 * 该算法具有多个优点,包括提高密码安全性、强大的密钥派生功能和可扩展性和灵活性。 * PBKDF2 算法主要用于密码存储和验证过程中。 * 该算法还提供了一个随机盐的生成方法,以防止彩虹表攻击等恶意破解手段。 **主要方法** * `encodedCredential()` 方法用于将密码和盐值加密为一个字符串。 * `getSalt()` 方法用于生成一个随机盐。 * `SecretKeyFactory` 类用于获取 PBKDF2 的密钥工厂。 **单元测试** 本文提供了一个单元测试,用于验证 PBKDF2 算法的正确性。

正文

摘要:在当今的数字世界中,密码安全是至关重要的。为了保护用户密码免受未经授权的访问和破解,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让密码更安全相似的内容:

算法~PBKDF2-SHA让密码更安全

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

算法~利用zset实现滑动窗口限流

滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口大小、请求次数阈值和时间间隔。 维护窗口:将请求按照时间顺序放入窗口中,并保持窗口内请求数量不超过阈值。 检查

单窗算法的地表温度反演:谷歌地球引擎GEE代码

本文介绍在GEE中基于Landsat遥感影像实现地表温度(LST)单窗算法反演的代码~

算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)

# 扩展中国剩余定理 [TOC] 讲解扩展之前,我们先叙述一下普通的中国剩余定理 > “China Remain Theory” 也叫做**孙子定理** > > 难得是以中国命名的定理~~,谁敢不掌握~~ ## 中国剩余定理 > 中国剩余定理通过一种非常精巧的构造求出了一个可行解 > > 但是毕竟是

SMOGN算法Python实现:解决回归分析中的数据不平衡

本文介绍基于Python语言中的smogn包,读取.csv格式的Excel表格文件,实现SMOGN算法,对机器学习、深度学习回归中,训练数据集不平衡的情况加以解决的具体方法~

ENVI、ERDAS计算Landsat 7地表温度:单窗算法实现

本文介绍基于ENVI与ERDAS软件,对Landsat 7遥感影像数据加以单窗算法的地表温度(LST)反演操作~

LeetCode 周赛 332,在套路里摸爬滚打~

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,今天是 3T 选手小彭。 上周是 LeetCode 第 332 场周赛,你参加了吗?算法解题思维需要长时间锻炼,加入我们一起刷题吧~ 小彭的 Android 交流群 02 群已经建立啦,公众号回复 “

MATLAB实现随机森林(RF)回归与自变量影响程度分析

本文介绍基于MATLAB,利用随机森林(RF)算法实现回归预测,以及自变量重要性排序的操作~

前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】

这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 AStar 算法进行路径规划,启发方式为 曼哈顿距离,且不允许对角线移动。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示

LeetCode 周赛 333,你管这叫 Medium 难度?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周是 LeetCode 第 333 场周赛,你参加了吗?这场周赛质量很高,但难度标得不对,我真的会谢。算法解题思维需要长时间锻炼,加入我们一起刷题吧~ 小彭的 Android 交流群 0