加密与安全_探索口令加密算法(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,生成一个复杂且安全的密钥,进而增强了对称加密算法的安全性,为数据加密提供了更加可靠的保障。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024最新算法:斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)求解23个基准函数

一、斑翠鸟优化算法 斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法&#xff0c;它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵感。PKO 算法围绕三个不…

MySQL数据库引擎,以及常用引擎的区别

先看图&#xff1a; mysql常用引擎包括&#xff1a;MYISAM、Innodb、Memory、MERGE MYISAM&#xff1a; 全表锁&#xff0c;拥有较高的执行速度&#xff0c;不支持事务&#xff0c;不支持外键&#xff0c;并发性能差&#xff0c;占用空间相对较小&#xff0c;对事务完整性没有…

SpringBoot整合rabbitmq-主题交换机队列(四)

说明&#xff1a;Topic主题交换机它的大致流程是交换机和一个或者多个队列绑定&#xff0c;这个绑定的Routingkey是包含通配符的&#xff0c;满足通配符的队列会接收到消息。 通配符规则&#xff1a; #&#xff1a;匹配一个或多个词 *&#xff1a;匹配一个词 例如&#xff…

2024洗地机深度测评推荐,洗地机哪款值得入手?新手入门必看洗地机选购技巧

洗地机是近年来备受瞩目的智能家居产品&#xff0c;它能够有效地帮助我们节省劳动时间&#xff0c;高效清洁地面&#xff0c;从而减轻我们的劳动负担。洗地机实现了扫地和拖地的一体化功能&#xff0c;在扫地的同时还能顺便完成地面的拖洗工作。配备水箱的设计使得不再需要频繁…

【kubernetes VPA】记录一次安装 VPA 相关组件的报错解决过程

文章目录 1. 问题描述2. 问题原因3. 解决办法4. 参考链接 1. 问题描述 在执行 ./hack/vpa-up.sh脚本命令时&#xff0c;提示有报错。名为vpa-admission-controller的容器状态一直停留在ContainerCreating&#xff0c;从该Pod详细描述中得知&#xff0c;volume "tls-certs…

常见外设学习以及无线通信频率

常见外设 UART UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种异步、串行、全双工的通信总线。 UART 有3根线&#xff0c;分别是&#xff1a;发送线&#xff08;TX&#xff09;、接收线&#xff08;RX&#xff…

AT24C1024的模拟IIC驱动

AT24C1024是基于IIC的EEPROM&#xff0c;容量为1024/8128k bytes。它的引脚如下&#xff1a; 其中A1,A2为硬件地址引脚 WP为写保护引脚&#xff0c;一般我们需要读写&#xff0c;需要接低电平GND&#xff0c;接高的话则仅允许读 SDA和SCL则为IIC通信引脚 芯片通信采用IIC&…

02、MongoDB -- MongoDB 的安全配置(创建用户、设置用户权限、启动安全控制、操作数据库命令演示、mongodb 的帮助系统介绍)

目录 MongoDB 的安全配置演示前准备&#xff1a;启动 mongodb 服务器 和 客户端 &#xff1a;1、启动单机模式的 mongodb 服务器2、启动 mongodb 的客户端 MongoDB 的安全配置启动演示用到的 mongodb 服务器 和 客户端启动单机模式的 mongodb 服务器&#xff1a;启动 mongodb 的…

【数据结构】19 平衡二叉树

定义 平衡二叉树又称为AVL树&#xff0c;是具有以下性质的非空搜索树&#xff1a; 任一结点的左、右子树均为AVL树。根节点的左、右子树高度差的绝对值不超过1. 对于二叉树的任一结点T&#xff0c;其平衡因子&#xff08;BF&#xff09;定义为BF(T) h L − h R h_L- h_R hL…

攻防世界-get_post

题目信息 相关知识 -G&#xff1a;表示GET请求&#xff0c;缺省POST -d参数用于发送 POST 请求的数据体 使用-d参数以后&#xff0c;HTTP 请求会自动加上标头Content-Type : application/x-www-form-urlencoded。并且会自动将请求转为 POST 方法&#xff0c;因此可以省略-X PO…

使用GPTQ进行4位LLM量化

使用GPTQ进行4位LLM量化 最佳脑量化GPTQ算法步骤1:任意顺序洞察步骤2:延迟批量更新第三步:乔尔斯基重塑 用AutoGPTQ量化LLM结论References 权重量化的最新进展使我们能够在消费级硬件上运行大量大型语言模型&#xff0c;例如在RTX 3090 GPU上运行LLaMA-30B模型。这要归功于性能…

信息收集2.0版本

内网渗透之信息收集 whois查询 1.1.1.1. 在线网站查询 输入相关的域名即可进行查询。 &#xff08;1&#xff09;站长之家&#xff1a;whois域名查询&#xff1a;http://whois.chinaz.com/ &#xff08;2&#xff09;爱站工具网&#xff1a;whois域名查询&#xff1a;站长…

mysql数据库操作小寄巧

目录 json字段查询时间相关只有日期只有时间又有时间又有日期时间比较时间运算 某字段同的取最新数据&#xff08;软性的新数据覆盖旧数据查找&#xff09;sql_modeonly_full_group_by的解决办法优化思路 json字段查询 查询某个json字段&#xff08;xx&#xff09;的某个属性下…

【考研数学】零基础备考全年计划

25考研数学基础差&#xff0c;一定要重视基础的复习&#xff01; 基础不牢&#xff0c;地动山摇&#xff0c;这句话在如今的考研更加贴切 24考研的新形势&#xff1a; 重基础、计算量大、反押题 每一个变化对于基础差的同学都不是好消息。 做过近几年考研真题的人都会发现…

AI时代编程新宠!如何让孩子成为未来的编程大师?

文章目录 一、了解编程的基础概念二、选择适合的编程工具三、激发孩子的兴趣四、注重基础能力的培养五、提供实践机会六、鼓励孩子与他人合作七、持续支持与鼓励《信息学奥赛一本通关》本书定位内容简介作者简介目录 随着科技的迅猛发展&#xff0c;编程已经从一种专业技能转变…

代码随想录第二十五天 78.子集 90.子集II 491.非递减子序列

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

iOS卡顿原因与优化

iOS卡顿原因与优化 1. 卡顿简介 卡顿&#xff1a; 指用户在使用过程中出现了一段时间的阻塞&#xff0c;使得用户在这一段时间内无法进行操作&#xff0c;屏幕上的内容也没有任何的变化。 卡顿作为App的重要性能指标&#xff0c;不仅影响着用户体验&#xff0c;更关系到用户留…

SpringBoot整合JdbcTemplate

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合JdbcTemplate 📚个人知识库: Leo知识库,欢迎大家访问 目录 …

设置文字之间的间距应该如何实现

设置文字之间的间距&#xff0c;通常指的是字母之间&#xff08;字符间距&#xff09;或单词之间的间距。在CSS中&#xff0c;这可以通过letter-spacing和word-spacing属性来实现。 字符间距&#xff08;letter-spacing&#xff09; letter-spacing属性用于调整字符之间的间距…

【Git学习笔记】提交PR

step1 克隆一个仓库 git clone .....step2 创建一个分支 (Creating a branch) # 创建并切换到本地新分支&#xff0c;分支的命名尽量简洁&#xff0c;并与解决的问题相关 git checkout -b delete-unused-linkstep3 做出修改 (Make changes) step4 提交修改 # 保存本地修…