加密与安全_ Jasypt (Java Simplified Encryption)不完全指北

news2025/1/19 11:37:39

文章目录

  • 官网
  • 功能概述
  • Code

在这里插入图片描述


官网

http://www.jasypt.org/
在这里插入图片描述


功能概述

Jasypt 是一个 Java 库,它允许开发人员以最小的努力添加基本的加密功能,并且不需要深入了解密码学的工作原理。

  • 高安全性、基于标准的加密技术,适用于单向和双向加密。加密密码、文本、数字、二进制文件…
  • 与 Hibernate 的透明集成
  • 适合集成到基于 Spring 的应用程序中,也可以与 Spring Security 透明集成
  • 用于加密应用程序配置(即数据源)的集成功能
  • 多处理器/多核系统中高性能加密的特定功能
  • 开放 API,可与任何 JCE 提供商一起使用

在这里插入图片描述


Code

<dependency>
    <groupId>com.iluwatar</groupId>
    <artifactId>jaspyt</artifactId>
    <version>1.9.3</version>
</dependency>

 package com.artisan.jasypt.javaway;

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.util.password.BasicPasswordEncryptor;
import org.jasypt.util.text.BasicTextEncryptor;

import java.security.SecureRandom;

/**
 * @author 小工匠
 * @version 1.0
 * @mark: show me the code , change the world
 *
 * http://www.jasypt.org/download.html
 */
public class JasyptExample {

    /**
     * 程序的主入口函数。
     * 该函数不接受参数,也不返回任何值。
     * 依次调用了以下几个示例函数:
     * 1. basicExample - 展示基本示例。
     * 2. oneWayPasswordExample - 展示使用一次性密码的示例。
     * 3. changeAlgorithmExample - 展示改变算法的示例。
     * 4. multiThreadDecryptExample - 展示多线程解密的示例。
     */
    public static void main(String[] args) {
        basicExample();

        oneWayPasswordExample();

        changeAlgorithmExample();

        multiThreadDecryptExample();
    }



    /**
     * 生成一个安全的随机密码。
     * 该函数不接受任何参数。
     *
     * @return 返回一个由随机字符组成的密码字符串。密码由大写字母、小写字母和数字组成,长度为16个字符。
     */
    private static String generateSecurePassword() {
        // 创建一个安全随机数生成器
        SecureRandom random = new SecureRandom();
        // 定义密码可能包含的字符集
        char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
        // 使用StringBuilder来构建密码字符串
        StringBuilder passwordBuilder = new StringBuilder();

        // 循环生成16个随机字符
        for (int i = 0; i < 16; i++) {
            // 从字符集中随机选择一个字符,并将其添加到密码字符串中
            passwordBuilder.append(chars[random.nextInt(chars.length)]);
        }

        System.out.println("key:" + passwordBuilder);
        // 返回构建好的密码字符串
        return passwordBuilder.toString();
    }



    /**
     * 简单文本加密示例
     * 该方法演示了如何使用BasicTextEncryptor对文本进行加密和解密。
     * 该示例不接受参数,也不返回值。
     */
    protected static void basicExample() {
        BasicTextEncryptor basicTextEncryptor = new BasicTextEncryptor();

        // 使用动态生成的密钥,提高安全性
        String securePassword = generateSecurePassword();
        basicTextEncryptor.setPassword(securePassword);

        try {
            // 加密文本信息
            String encryptedText = basicTextEncryptor.encrypt("artisan*");
            System.out.println("encryptedText:" +  encryptedText);

            // 解密已加密的文本信息
            String decryptedText = basicTextEncryptor.decrypt(encryptedText);
            System.out.println("decryptedText:" + decryptedText);
        } catch (Exception e) {
            // 处理加密/解密过程中可能出现的异常
            System.err.println("Error during encryption or decryption: " + e.getMessage());
        }
    }


    /**
     * 展示单向密码加密的示例。
     * <p>
     * 两种方案:
     * 一种方案是把数据库中的密文解密成明文,再与用户输入的密码进行对比;
     * 另一种方案是把用户输入的密码进行加密,把加密后的密文与数据库的密文进行对比。
     * <p>
     * 第二种方案是更合理的,一方面是因为加密比解密更容易,性能更好;
     * 另一方面是减少明文出现的次数,保证安全性。
     * 第二种方案完全不需要解密,所以我们只需要单向地密码加密便可以了
     */
    private static void oneWayPasswordExample() {
        // 创建BasicPasswordEncryptor实例用于密码加密和验证
        BasicPasswordEncryptor encryptor = new BasicPasswordEncryptor();
        // 加密密码 "artisan*"
        String encryptedPassword = encryptor.encryptPassword("artisan*");
        // 检查密码 "artisan*" 是否与加密后的密码匹配,并打印结果
        System.out.println(encryptor.checkPassword("artisan*", encryptedPassword));

        // 检查密码 "Artisan*" (大写) 是否与加密后的密码匹配,并打印结果,预期为不匹配
        System.out.println(encryptor.checkPassword("Artisan*", encryptedPassword));
    }


    /**
     * 该示例演示如何改变加密算法。
     * 该方法不接受参数且无返回值。
     * 主要步骤包括创建加密器、设置密码和算法、加密数据以及解密数据。
     * <p>
     * 自定义地使用不同的算法进行加密解密
     */
    private static void changeAlgorithmExample() {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        System.out.println("---------");
        // 设置加密器的密码
        //encryptor.setPassword(generateSecurePassword());
        encryptor.setPassword("rQIVmVRhL7Zr2Kmu");
        // 设置加密器使用的加密算法
        encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

        // 使用加密器对文本进行加密
        String encryptedText = encryptor.encrypt("artisan*");
        System.out.println("encryptedText:" + encryptedText);

        // 使用加密器对加密后的文本进行解密
        String decryptedText = encryptor.decrypt(encryptedText);
        System.out.println("decryptedText:" + decryptedText);
    }


    /**
     * 多线程解密示例
     * 该方法演示了如何使用多线程进行加密和解密操作。
     * 注意:该方法不接受任何参数,也不返回任何值。
     * <p>
     * Jasypt提供了多线程解密操作,可以并行解密,这样可以提供更好的性能。一般建议可以设置与机器处理器核数一致的线程数进行解密
     */
    private static void multiThreadDecryptExample() {

        // 创建并配置加密器,使用池化技术以支持多线程加密
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

        // 设置线程池大小为6,即同时最多有6个线程执行加密操作
        encryptor.setPoolSize(6);

        // 设置加密使用的密码
        encryptor.setPassword(generateSecurePassword());

        // 设置加密算法
        encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

        // 加密明文字符串
        String encryptedText = encryptor.encrypt("artisan*#*");
        System.out.println("encryptedText:" + encryptedText);

        // 解密密文字符串
        String decryptedText = encryptor.decrypt(encryptedText);
        System.out.println("decryptedText:" + decryptedText);
    }


}
    
  1. generateSecurePassword: 生成一个16字符长的安全随机密码。
  2. basicExample: 使用BasicTextEncryptor对文本进行加密和解密。
  3. oneWayPasswordExample: 使用BasicPasswordEncryptor进行单向密码加密和验证。
  4. changeAlgorithmExample: 使用StandardPBEStringEncryptor并设置自定义算法进行加密和解密。
  5. multiThreadDecryptExample: 使用PooledPBEStringEncryptor进行多线程的加密和解密操作。

在这里插入图片描述


Java 加密体系 (JCA)

在这里插入图片描述

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

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

相关文章

VBA中类的解读及应用第十三讲:限制复选选择,窗体模块的搭建

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

第十五章 Qt的QGraphics View绘图框架详解

目录 一、视图、场景、图形项 1、Graphics View 绘图架构 1.1、图形项 GraphicsItem 1.2、场景 QGraphicsScene 1.3、视图 QGraphicsView 2、图形项、场景、视图的坐标系 3、Graphics View 基础练习 二、使用自定义视图处理鼠标事件 1、添加自定义视图类 2、使用自定…

【python基础】—calendar模块

文章目录 前言一、calendar模块方法1.firstweekday()2.setfirstweekday(firstweekday)3.isleap(year)4.leapdays(y1, y2)5.weekday(year, month, day)6.monthrange(year, month)7.weekheader(n)8.monthcalendar(year, month)9.prmonth(theyear, themonth, w0, l0)10.prcal(year…

Java WebService记

Web Services开发 常用的 Web Services 框架有 Apache Axis1 、 Apache Axis2 、 Apache CXF &#xff0c;而 Apache Axis1 已经逐渐被淘汰所以本文不会讨论&#xff0c;重点关注 Apache Axis2 及 Apache CXF 。 Apache Axis2 在IDEA中新建 Axis2Demo 项目后右键选择 添加框架…

Access,Trunk,Hybrid网络设备链接类型详解

带着问题找答案&#xff1a;网络链路上的数据包怎么看&#xff0c;是否携带vlan-id如何看&#xff0c;以及如何设计链接类型满足用户要求&#xff0c;请看如下解析。 第一种&#xff1a;链接类型access 无标记数据帧 第二种&#xff1a;链接类型trunk 第三种&#xf…

java前后端加密解密crypto-js_java crypto

} let srcs CryptoJS.enc.Utf8.parse(word); var encrypted CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }); return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); } /** 1. AES 解密 &#xff1a;字符…

怎么用AI合成PPT?这5款风靡全球的AIPPT软件一定要知道!

当下我们已进入信息过载的时代&#xff0c;每天有无数的信息试图争夺我们的注意力&#xff0c;与此同时&#xff0c;我们也需要向别人展示和呈现信息&#xff0c;这就要求我们能够以最低的成本&#xff0c;在短时间内引起对方的注意&#xff0c;这其中最常用到的工具非PPT莫属。…

融资融券利率怎么计算,两融交易开通条件和操作流程

融资融券利率 融资融券的利率没有固定的数额&#xff0c;现在融资利率最低是4%~5%&#xff0c;专项融券利率2.99%起&#xff0c;公共券源利率9.35%。 融资利息计算 融资利息是指投资者借入资金进行买入股票时需要支付的利息。 计算公式为&#xff1a;融资利息 融资金额 融…

《ClipCap》论文笔记(下)

原文出处 [2111.09734] ClipCap: CLIP Prefix for Image Captioning (arxiv.org) 原文翻译 接上篇 《ClipCap》论文笔记&#xff08;上&#xff09;-CSDN博客 4. Results Datasets.我们使用 COCO-captions [7,22]、nocaps [1] 和 Conceptual Captions [33] 数据集。我们根…

概率论与数理统计_上_科学出版社

contents 前言第1章 事件与概率1.1 随机事件与样本空间1.1.1 样本空间1.1.2 随机事件1.1.3 事件之间的关系与运算 1.2 概率的三种定义及其性质1.2.1 概率的统计定义1.2.2 概率的古典定义1.2.3 概率的几何定义1.2.4 概率的性质 1.3 常用概型公式1.3.1 条件概率计算公式1.3.2 乘法…

【设计模式】设计模式学习线路与总结

文章目录 一. 设计原则与思想二. 设计模式与范式三. 设计模式进阶四. 项目实战 设计模式主要是为了改善代码质量&#xff0c;对代码的重用、解耦以及重构给了最佳实践&#xff0c;如下图是我们在掌握设计模式过程中需要掌握和思考的内容概览。 一. 设计原则与思想 面向对象编…

功能详解-电商接口丨电商API

随着电商平台各类机制日益成熟&#xff0c;电商接口逐渐被大家所熟知&#xff0c;淘宝、天猫、京东、拼多多、抖店、快手、小红书这些都是主流的电商平台&#xff0c;为了提升电商管理系统的效率&#xff0c;开发者可以通过电商接口将多个电商平台的数据和功能集成。 电商接…

海外短剧CPS推广分佣系统平台讲解,他和短剧播放平台有啥区别?

首先来讲讲什么是海外短剧系统&#xff1f;什么是海外短剧cps系统&#xff1f;这俩有何区别&#xff1f; 海外短剧系统 顾名思义&#xff1a;就是做一套海外短剧系统&#xff0c;把剧放在自己的系统内&#xff0c;让用户来充值&#xff0c;充值的钱全部都是我自己的&#xff…

【人工智能】--生成对抗网络

个人主页&#xff1a;欢迎来到 Papicatch的博客 课设专栏 &#xff1a;学生成绩管理系统 专业知识专栏&#xff1a; 专业知识 文章目录 &#x1f349;引言 &#x1f349;GAN 的基本原理 &#x1f348;生成器&#xff08;Generator&#xff09; &#x1f348;判别器&…

[数据集][目标检测]刀具匕首持刀检测数据集VOC+YOLO格式8810张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8810 标注数量(xml文件个数)&#xff1a;8810 标注数量(txt文件个数)&#xff1a;8810 标注…

超详细!大模型面经指南(附答案)

目录 大模型&#xff08;LLMs&#xff09;基础面 1. 目前 主流的开源模型体系 有哪些&#xff1f; 2. prefix LM 和 causal LM 区别是什么&#xff1f; 3. 涌现能力是啥原因&#xff1f; 4. 大模型LLM的架构介绍&#xff1f; 大模型&#xff08;LLMs&#xff09;进阶面 1. l…

mysql:部署MySQL 8.0 环境

mysql网址&#xff1a;MySQL 点击 MySQL Community Server 选择合适的版本 选择8.0版本 下载完成&#xff0c;点击mysql-installer-community-8.0.26.0.msi文件&#xff0c;打开安装向导。 选择自定义安装类型 打开“Select Products” 窗口&#xff0c;可以定制需要安装的产…

Teamviewer删除可信任设备

目前基本上主流的远程连接软件都有限制&#xff0c;要么收费&#xff1b; Teamviewer可信任设备有限&#xff0c;超出限制就会提示错误&#xff0c;需要删除多余的设备才能登陆账号&#xff01; 需要登陆这个网站 Teamviewer Management console&#xff0c;才能修改&#xff…

高级IO_多路转接之Poll

文章目录 前言一、poll二、poll使用步骤总结 前言 上一章我们学习了select&#xff0c;但是select作为早期的多路转接接口&#xff0c;缺点十分明显&#xff0c;于是又出现poll和epoll等接口&#xff0c;今天我们就来学习一下poll的使用 提示&#xff1a;以下是本篇文章正文内…

7.4总结

今天写了几道题目 最近&#xff0c;一年级学生马克西姆学习了科拉兹猜想&#xff0c;但他在讲课时没有太注意&#xff0c;所以他认为猜想中提到了以下过程&#xff1a; 有一个变量 $$$x$$$ 和一个常数 $$$y$$$ 。下面的操作要执行 $$$k$$$ 次&#xff1a; - 将 $$$x$$$ 增加…