加密与安全_探索口令加密算法(PBE)

2024-03-02 06:52

本文主要是介绍加密与安全_探索口令加密算法(PBE),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 概述
  • 疑问
  • PBE 算法 ( Password Based Encryption)
  • Code
    • POM
    • 实现
  • 小结

在这里插入图片描述


概述

加密与安全_探索对称加密算法中我们提到AES加密密钥长度是固定的128/192/256位,而不是我们用WinZip/WinRAR那样,随便输入几位都可以。

这是因为对称加密算法决定了口令必须是固定长度,然后对明文进行分块加密。又因为安全需求,口令长度往往都是128位以上,即至少16个字符。


疑问

我们平时使用的加密软件,输入6位、8位都可以,难道是加密方式不一样吗?

用户输入的口令往往不能直接作为AES的密钥进行加密,因为它们的长度通常不符合AES密钥的要求,而且可能存在规律性,容易受到字典攻击等安全威胁。

为了解决这个问题,通常会使用PBE算法,采用随机数杂凑计算出真正的密钥,再进行加密。。


PBE 算法 ( Password Based Encryption)

PBE算法(Password-Based Encryption)是一种安全的密码基础加密算法,用于将用户输入的口令转换为符合要求的密钥,以便进行加密操作。 在使用PBE算法时,用户只需输入一个口令,而不需要直接提供一个符合要求的密钥。PBE算法的作用是通过结合用户输入的口令和一个安全随机生成的盐值,采用杂凑计算的方式生成最终的密钥。

通俗的可以理解为下面的函数:

key = generate(userPassword, secureRandomPassword);

以AES密钥生成为例,用户只需输入一个口令,而不需要担心口令的长度和复杂度是否符合要求。PBE算法会在内部生成一个安全的随机数作为盐值,并将用户输入的口令与盐值一起进行杂凑计算,从而生成一个符合AES加密算法要求的真正密钥。

通过这种方式,PBE算法实现了对用户口令的保护,同时确保生成的密钥符合加密算法的要求,从而提高了整个加密系统的安全性。


Code

POM

   <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version></dependency>

实现

package com.artisan.securityalgjava.peb;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import java.math.BigInteger;
import java.security.GeneralSecurityException;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world* 使用PBE算法进行加密和解密示例*/
public class PBEExample {public static void main(String[] args) throws Exception {// 将BouncyCastle作为Provider添加到java.security:Security.addProvider(new BouncyCastleProvider());// 原文:String message = "Hello, world!";// 加密口令:String password = "hello12345";// 16 bytes随机Salt:byte[] salt = SecureRandom.getInstanceStrong().generateSeed(16);System.out.printf("salt: %032x\n", new BigInteger(1, salt));// 加密:byte[] data = message.getBytes("UTF-8");byte[] encrypted = encrypt(password, salt, data);System.out.println("encrypted: " + Base64.getEncoder().encodeToString(encrypted));// 解密:byte[] decrypted = decrypt(password, salt, encrypted);System.out.println("decrypted: " + new String(decrypted, "UTF-8"));}// 加密:public static byte[] encrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {// 使用口令生成PBEKeySpec对象PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());// 创建密钥工厂SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 生成密钥对象SecretKey skey = skeyFactory.generateSecret(keySpec);// 创建PBE参数对象PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);// 创建加密器Cipher cipher = Cipher.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 初始化加密器cipher.init(Cipher.ENCRYPT_MODE, skey, pbeps);// 执行加密操作return cipher.doFinal(input);}// 解密:public static byte[] decrypt(String password, byte[] salt, byte[] input) throws GeneralSecurityException {// 使用口令生成PBEKeySpec对象PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray());// 创建密钥工厂SecretKeyFactory skeyFactory = SecretKeyFactory.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 生成密钥对象SecretKey skey = skeyFactory.generateSecret(keySpec);// 创建PBE参数对象PBEParameterSpec pbeps = new PBEParameterSpec(salt, 1000);// 创建解密器Cipher cipher = Cipher.getInstance("PBEwithSHA1and128bitAES-CBC-BC");// 初始化解密器cipher.init(Cipher.DECRYPT_MODE, skey, pbeps);// 执行解密操作return cipher.doFinal(input);}
}

在使用PBE时,引入BouncyCastle提供了更多的加密算法支持,并且可以使用其中的PBE算法。

  • 指定算法为PBEwithSHA1and128bitAES-CBC-BC表明了我们使用SHA1和128位AES加密算法结合的PBE算法。

  • 真正的AES密钥是在调用Cipher#init()方法时同时传入SecretKeyPBEParameterSpec实现的。在创建PBEParameterSpec时,我们指定了循环次数为1000。循环次数的增加可以增加破解所需的计算量,从而提高加密的安全性。

  • 如果我们固定了salt和循环次数,就得到了一个通用的“口令”加密软件。用户只需要输入口令,程序就可以使用固定的salt和循环次数来加密和解密数据。

  • 如果我们将随机生成的salt存储在U盘中,就可以得到一个“口令”加USB Key的加密软件。这种方式的好处在于,即使用户使用了一个非常弱的口令,没有U盘也无法解密,因为U盘存储的随机数密钥具有很高的安全性。


小结

  • PBE算法(Password-Based Encryption)通过用户输入的口令和一个安全的随机salt结合,经过多次迭代的杂凑计算生成最终的密钥(Key),然后再使用这个密钥进行加密操作。这种方式的安全性得到了显著提高,因为即使用户输入的口令较弱,通过引入随机salt和多次迭代的杂凑计算,生成的密钥也具有足够的复杂性和随机性,从而增加了破解的难度。

  • PBE算法内部使用的仍然是标准的对称加密算法,例如AES。生成的密钥(Key)是由用户口令和随机salt计算得出的,然后再传递给底层的对称加密算法进行加密和解密操作。这种结构既保留了对称加密算法的高效性和快速性,又通过PBE算法增加了用户口令的安全性,使得整个加密过程更加安全可靠。

总之,PBE算法通过结合用户口令和安全的随机salt,生成一个复杂且安全的密钥,进而增强了对称加密算法的安全性,为数据加密提供了更加可靠的保障。

在这里插入图片描述

这篇关于加密与安全_探索口令加密算法(PBE)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765277

相关文章

SpringBoot3使用Jasypt实现加密配置文件

《SpringBoot3使用Jasypt实现加密配置文件》这篇文章主要为大家详细介绍了SpringBoot3如何使用Jasypt实现加密配置文件功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... 目录一. 使用步骤1. 添加依赖2.配置加密密码3. 加密敏感信息4. 将加密信息存储到配置文件中5

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于