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

news2024/11/17 14:31:40

文章目录

  • 概述
  • 疑问
  • 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.coloradmin.cn/o/1482224.html

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

相关文章

Mac 以SH脚本安装Arthas

SH脚本安装Aethas curl -L https://alibaba.github.io/arthas/install.sh | sh安装脚本说明 示例源文件&#xff1a; #! /bin/bash# temp file of as.sh TEMP_ARTHAS_FILE"./as.sh.$$"# target file of as.sh TARGET_ARTHAS_FILE"./as.sh"# update timeo…

alpine创建lnmp环境alpine安装nginx+php5.6+mysql

前言 制作lnmp环境&#xff0c;你可以在alpine基础镜像中安装相关的服务&#xff0c;也可以直接使用Dockerfile创建自己需要的环境镜像。 注意&#xff1a;提前确认自己的alpine版本&#xff0c;本次创建基于alpine3.6进行创建&#xff0c;官方在一些版本中删除了php5 1、拉取…

Flutter中Future和Stream关系

Future和Stream类是Dart异步编程的核心。 Future 表示一个不会立即完成的计算过程。与普通函数直接返回结果不同的是异步函数返回一个将会包含结果的 Future。该 Future 会在结果准备好时通知调用者。 Stream 是一系列异步事件的序列。其类似于一个异步的 Iterable&#xff0c;…

Linux磁盘性能方法以及磁盘io性能分析

Linux磁盘性能方法以及磁盘io性能分析 1. fio压测1.1. 安装fio1.2. bs 4k iodepth 1&#xff1a;随机读/写测试&#xff0c;能反映硬盘的时延性能1.3. bs 128k iodepth 32&#xff1a;顺序读/写测试&#xff0c;能反映硬盘的吞吐性能 2. dd压测2.1. 测试纯写入性能2.2. 测试…

禾赛戳了自动驾驶的眼睛?

大数据产业创新服务媒体 ——聚焦数据 改变商业 激光雷达之于自动驾驶&#xff0c;就如同眼睛和大脑至于人&#xff0c;重要性自然不言而喻。 然而&#xff0c;对于自动驾驶如此重要的关键零件&#xff0c;2月29日&#xff0c;有消息称&#xff0c;部分使用禾赛科技激光雷达的…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2&#xff0c;将元素分为d1个组&#xff0c;每组相邻量取元素距离为d1&#xff0c;在各组内直接进行插入排序&#xff1b;取第二个整数d2 d1/2&#xff0c; 重复上述分组排序过程&#xff0…

鬼屋游戏c++

c #include <iostream> #include <string> #include <vector> #include <cstdlib> // 用于随机数生成 #include <ctime> // 用于随机数种子using namespace std;// 定义房间结构体 struct Room {string description;bool hasKey;bool hasClue…

Java中的动态代理与Spring AOP编程

第一章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在Java里&#xff0c;动态代理和Spring AOP&#xff08;面向切面编程&#xff09;是两个能让代码更加灵活、更加干净的强大工具。作为一名Java程序员&#xff0c;小黑觉得掌握它们对于写出高质量的代码来说非常…

win11安装nodejs

一、下载安装包 链接: https://pan.baidu.com/s/1_df8s1UlgNNaewWrWgI59A?pwdpsjm 提取码: psjm 二、安装步骤 1.双击安装包 2.Next> 3.勾选之后&#xff0c;Next> 4.点击Change&#xff0c;选择你要安装的路径&#xff0c;然后Next> 5.点击Install安装 二、…

最新Sora人工智能视频资源网址分享

1&#xff0c;了解什么是Sora * 什么是 OpenAI Sora&#xff1f; Sora 是由 OpenAI 开发的文本到视频模型。它可以按照用户的提示生成长达一分钟的高质量和一致的视频。 * 如何使用 OpenAI Sora 模型&#xff1f; 目前&#xff0c;OpenAI Sora 模型处于内测阶段&#xff0c;并将…

深入剖析k8s-Pod篇

为什么需要Pod&#xff1f; 进程是以进程组的方式组织在一起。受限制容器的“单进程模型”&#xff0c; 成组调用没有被妥善处理&#xff08;资源调用有限&#xff09;&#xff0c;使用资源囤积则导致复杂度上升。 在k8s项目中&#xff0c;Pod的实现需要使用一个中间容器——…

【快速选择】解决TopK问题

目录 一、什么是TopK问题 二、优先级队列 优先级队列介绍 代码实现 三、使用优先级队列解决TopK问题 四、快速选择算法解决TopK问题 快速选择 图解快速选择 代码解决前k小个元素 五、优先级队列与快速选则算法比较 优先级队列 快速选择 一、什么是TopK问题 TopK问题…

Mybatis plus核心功能-IService

目录 1 前言 2 使用方法 2.1 继承ServiceImpl,> 2.2 基础业务开发的使用 2.3 复杂业务开发的使用 2.3 Lambda查询 2.4 Lambda更新 1 前言 我本以为Mapper层的类能够继承BaseMapper<XXX>&#xff0c;而不用我们手动写一些mapper方法已经够离谱了。没想到海油膏…

Zookeeper学习1:概述、安装、应用场景、集群配置

文章目录 概述安装LinuxWindows 配置参数集群参考配置文件配置步骤流程启动 概述 Zookeeper&#xff1a; 为分布式框架组件提供协调服务的中间件 【类似&#xff1a;文件系统通知机制】 负责存储上下层应用关系的数据以及接收观察者注册监听&#xff0c;一旦观察查关心的数据发…

gpt批量工具,gpt批量生成文章工具

GPT批量工具在今天的数字化时代扮演着越来越重要的角色&#xff0c;它们通过人工智能技术&#xff0c;可以自动批量生成各种类型的文章&#xff0c;为用户提供了便利和效率。本文将介绍5款不同的GPT批量工具&#xff0c;并介绍一款知名的147GPT生成工具&#xff0c;以及另外一款…

MyBatis的补充用法

说明&#xff1a;之前介绍过MyBatis的用法&#xff0c;像 用注解和Mapper.xml操作数据库、在Mapper.xml里写动态SQL。最近在一次用MyBatis批量更新数据库对象的场景中&#xff0c;意识到对MyBatis的一些标签用法不太熟悉&#xff0c;所以去 MyBatis官网 看了一些文档&#xff0…

(介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)

前言 本文详细介绍了如何利用物联网技术,通过NodeMCU ESP8266(ESP-12F)模块连接到新版的OneNet平台,使用MQTT协议实现数据的上传与指令的下发。文中首先对NodeMCU ESP8266模块及其特性进行了简介,随后详细阐述了如何配置和使用MQTT协议连接到OneNet平台,实现温湿度数据的…

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合&#xff0c;为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换&#xff0c;极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点&#xff0c;集中式架构拥有简单易用、管…

Java对象大小计算

概述 在实际应用中&#xff0c;尤其是在进行JVM调优时&#xff0c;理解并正确估计对象大小是非常重要的&#xff0c;因为这直接影响到内存分配、垃圾回收效率以及应用程序的整体性能。 对象的组成 在Java中&#xff0c;计算一个对象的大小是为了了解它在内存中占用的确切空间…

Leetcode2673. 使二叉树所有路径值相等的最小代价

Every day a Leetcode 题目来源&#xff1a;2673. 使二叉树所有路径值相等的最小代价 解法1&#xff1a;遍历 对于满二叉树&#xff0c;父节点 cost[i] 的左右儿子节点分别为 cost[2 * i - 1]、cost[2 * i]。 考虑根到两个互为兄弟节点&#xff08;父节点相同&#xff09;的…