Jasypt概述及整合SpringBoot实现敏感数据加密

前言

在实际开发中,Spring Boot应用的配置文件中经常包含数据库密码、API密钥等敏感信息。如果这些信息以明文形式存储,会带来严重的安全隐患。本文将详细介绍如何使用Jasypt(Java Simplified Encryption)对Spring Boot配置文件中的敏感数据进行加密,提高应用的安全性。

一、Jasypt简介

Jasypt(Java Simplified Encryption)是一个Java库,旨在为开发人员提供一种简单而强大的加密解决方案。它的设计目标是让开发者能够以最小的努力为项目添加基本的加密功能,而无需深入了解密码学的工作原理。

1.1 Jasypt的核心特性

Jasypt提供了一系列的核心特性,包括但不限于:

  • 基于标准的高安全性加密技术,无论是单向(摘要)还是双向(加密)
  • 支持多种加密算法,如AES、Blowfish等
  • 提供密码增强功能,如密码哈希和密码盐
  • 支持加密/解密文本和对象
  • 高度可配置的加密机制
  • 与Spring框架的无缝集成
  • 支持多线程解密操作,提供更好的性能
  • 易于配置和使用,对开发者友好

1.2 Jasypt的使用场景

Jasypt常用于以下场景:

  • 加密配置文件中的敏感信息,如数据库密码、API密钥等
  • 保护应用程序中的用户数据,如用户密码
  • 在应用程序之间安全地共享加密数据
  • 为Web应用程序提供安全的数据传输
  • 实现数据库字段级加密

1.3 Jasypt加密算法原理

Jasypt使用的加密算法基于对称密钥加密和哈希函数。理解这些算法的基本原理对于确保数据安全至关重要。

1.3.1 对称密钥加密

对称密钥加密,也称为秘密密钥加密,是一种加密方法,其中相同的密钥用于加密和解密数据。Jasypt支持多种对称加密算法,如AES(高级加密标准)和Blowfish。

AES算法:AES是一种广泛使用的对称加密算法,它使用128位、192位或256位的密钥对数据进行加密。AES算法的工作原理包括以下几个步骤:

  1. 密钥扩展:将原始密钥扩展成多个轮密钥
  2. 初始轮:将明文数据与第一个轮密钥进行异或操作
  3. 多轮加密:进行多轮的替换、行移位和列混淆操作,每轮使用一个不同的轮密钥
  4. 最终轮:最后一轮不进行列混淆,但会进行行移位和异或操作

Blowfish算法:Blowfish是一种可变的密钥长度的对称加密算法,它使用一个复杂的密钥调度算法和一个由多个小函数组成的网络来加密数据。

1.3.2 哈希函数

哈希函数是一种将任意长度的数据映射到固定长度的数据的函数。在Jasypt中,哈希函数通常用于密码的存储和验证。

密码哈希:密码哈希是一种将用户密码转换成固定长度哈希值的过程。Jasypt支持多种哈希算法,如SHA-256。哈希值通常与一个盐值结合使用,以增加密码的安全性。

1.4 Jasypt的基本使用方法

Jasypt提供了一套简单易用的API,使得在Java应用程序中实现加密和解密变得非常直接。以下是Jasypt的基本使用方法。

引入Jasypt依赖:首先,需要在项目中引入Jasypt的依赖。如果是使用Maven,可以在pom.xml文件中添加以下依赖:

<dependency><groupId>org.jasypt</groupId><artifactId>jasypt</artifactId><version>1.9.3</version>
</dependency>

使用BasicTextEncryptor进行加密和解密BasicTextEncryptor是Jasypt提供的一个简单工具类,可以用于基本的文本加密和解密。

import org.jasypt.util.text.BasicTextEncryptor;public class JasyptBasicUsage {public static void main(String[] args) {BasicTextEncryptor textEncryptor = new BasicTextEncryptor();textEncryptor.setPassword("mysecretkey");// 加密String encryptedText = textEncryptor.encrypt("Sensitive Data");System.out.println("Encrypted Text: " + encryptedText);// 解密String decryptedText = textEncryptor.decrypt(encryptedText);System.out.println("Decrypted Text: " + decryptedText);}
}

二、Spring Boot整合Jasypt

2.1 项目依赖配置

首先,需要在Spring Boot项目的pom.xml文件中添加Jasypt的依赖。根据不同的Spring Boot版本和需求,可以选择不同的集成方式。

2.1.1 方式一:使用jasypt-spring-boot-starter(推荐)

如果项目使用了@SpringBootApplication@EnableAutoConfiguration注解,可以直接使用starter依赖:

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
</dependency>
2.1.2 方式二:使用jasypt-spring-boot + @EnableEncryptableProperties

如果项目没有使用自动配置注解,可以通过以下方式集成:

<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot</artifactId><version>3.0.5</version>
</dependency>

然后在配置类上添加@EnableEncryptableProperties注解:

@Configuration
@EnableEncryptableProperties
public class JasyptConfig {// 配置内容
}
2.1.3 方式三:使用jasypt-spring-boot + @EncryptablePropertySource

如果只想对特定的配置文件启用加密功能,可以使用:

@Configuration
@EncryptablePropertySource(name = "EncryptedProperties", value = "classpath:encrypted.properties")
public class JasyptConfig {// 配置内容
}

2.2 配置Jasypt加密器

为了使用Jasypt进行加密和解密,需要配置一个StringEncryptor Bean。以下是一个完整的配置类示例:

package com.example.demo.config;import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class JasyptConfig {/*** 配置Jasypt加密器* * @return StringEncryptor加密器实例*/@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 设置加密密钥config.setPassword("your-secret-key");// 设置加密算法// 注意:Jasypt 3.0.0之后默认算法为PBEWITHHMACSHA512ANDAES_256// 需要JDK 9+或添加JCE支持,否则可能报错config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");// 设置密钥获取迭代次数config.setKeyObtentionIterations("1000");// 设置加密器的池大小config.setPoolSize("1");// 设置随机盐生成器config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");// 设置字符串输出格式config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

2.3 创建加密工具类

为了方便使用,可以创建一个工具类来进行加密操作:

package com.example.demo.util;import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;@Component
public class JasyptUtil {private final StringEncryptor encryptor;@Autowiredpublic JasyptUtil(@Qualifier("jasyptStringEncryptor") StringEncryptor encryptor) {this.encryptor = encryptor;}/*** 加密方法* * @param value 待加密的字符串* @return 加密后的字符串*/public String encrypt(String value) {return encryptor.encrypt(value);}/*** 解密方法* * @param value 待解密的字符串* @return 解密后的字符串*/public String decrypt(String value) {return encryptor.decrypt(value);}
}

2.4 配置文件中使用加密属性

Jasypt使用特定格式来标识加密的属性值。在配置文件中,加密的值需要使用ENC(加密后的值)格式。

2.4.1 application.properties示例
# 数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=ENC(Gyh5riZAZQAzFAX5ZDCpbQ==)
spring.datasource.password=ENC(qxqL/RfN8vW3q9RLXh7mAYV3JXxTtULq)# Jasypt配置
jasypt.encryptor.bean=jasyptStringEncryptor
2.4.2 application.yml示例
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: ENC(Gyh5riZAZQAzFAX5ZDCpbQ==)password: ENC(qxqL/RfN8vW3q9RLXh7mAYV3JXxTtULq)jasypt:encryptor:bean: jasyptStringEncryptor

2.5 密钥安全管理

为了提高安全性,不应该将加密密钥硬编码在代码或配置文件中。以下是几种安全管理密钥的方法:

2.5.1 使用环境变量

修改配置类,从环境变量中获取密钥:

@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 从环境变量获取密钥String password = System.getenv("JASYPT_PASSWORD");config.setPassword(password);// 其他配置...encryptor.setConfig(config);return encryptor;
}
2.5.2 使用命令行参数

在启动应用时通过命令行参数传入密钥:

java -jar your-app.jar --jasypt.encryptor.password=your-secret-key

然后在配置文件中使用:

jasypt:encryptor:password: ${JASYPT_ENCRYPTOR_PASSWORD:default-value}
2.5.3 使用配置中心

如果使用Spring Cloud Config或其他配置中心,可以将密钥存储在配置中心中。

三、完整的Spring Boot项目示例

下面是一个完整的Spring Boot项目结构和关键文件内容:

3.1 项目结构

src/
├── main/
│   ├── java/
│   │   └── com/
│   │       └── example/
│   │           └── demo/
│   │               ├── DemoApplication.java
│   │               ├── config/
│   │               │   └── JasyptConfig.java
│   │               ├── controller/
│   │               │   └── TestController.java
│   │               └── util/
│   │                   └── JasyptUtil.java
│   └── resources/
│       └── application.yml

3.2 DemoApplication.java

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

3.3 JasyptConfig.java

package com.example.demo.config;import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class JasyptConfig {@Value("${jasypt.encryptor.password:default-secret-key}")private String password;@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();config.setPassword(password);config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

3.4 JasyptUtil.java

package com.example.demo.util;import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;@Component
public class JasyptUtil {private final StringEncryptor encryptor;@Autowiredpublic JasyptUtil(@Qualifier("jasyptStringEncryptor") StringEncryptor encryptor) {this.encryptor = encryptor;}/*** 加密方法* * @param value 待加密的字符串* @return 加密后的字符串*/public String encrypt(String value) {return encryptor.encrypt(value);}/*** 解密方法* * @param value 待解密的字符串* @return 解密后的字符串*/public String decrypt(String value) {return encryptor.decrypt(value);}
}

3.5 TestController.java

package com.example.demo.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import com.example.demo.util.JasyptUtil;@RestController
public class TestController {@Autowiredprivate JasyptUtil jasyptUtil;@Value("${spring.datasource.password}")private String databasePassword;/*** 加密接口*/@GetMapping("/encrypt/{value}")public String encrypt(@PathVariable String value) {return jasyptUtil.encrypt(value);}/*** 解密接口*/@GetMapping("/decrypt/{value}")public String decrypt(@PathVariable String value) {return jasyptUtil.decrypt(value);}/*** 测试配置文件中的加密属性是否正确解密*/@GetMapping("/test")public String test() {return "Database password: " + databasePassword;}
}

3.6 application.yml

# Jasypt配置(必须放在最前面)
jasypt:encryptor:bean: jasyptStringEncryptor# 可以使用环境变量或命令行参数传入密钥password: ${JASYPT_ENCRYPTOR_PASSWORD:default-secret-key}# 如果使用Jasypt 3.0+且JDK版本低于9,需要指定兼容的算法algorithm: PBEWITHHMACSHA512ANDAES_256iv-generator-classname: org.jasypt.iv.RandomIvGenerator# 数据库配置
spring:datasource:url: jdbc:mysql://localhost:3306/mydbusername: ENC(Gyh5riZAZQAzFAX5ZDCpbQ==)password: ENC(qxqL/RfN8vW3q9RLXh7mAYV3JXxTtULq)

四、生成加密值的方法

有几种方法可以生成加密值:

4.1 使用JasyptUtil工具类

可以编写一个简单的测试类或使用Spring Boot的命令行运行器:

package com.example.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import com.example.demo.util.JasyptUtil;@SpringBootApplication
public class EncryptorApplication implements CommandLineRunner {@Autowiredprivate JasyptUtil jasyptUtil;public static void main(String[] args) {SpringApplication.run(EncryptorApplication.class, args);}@Overridepublic void run(String... args) {if (args.length > 0) {String encrypted = jasyptUtil.encrypt(args[0]);System.out.println("Encrypted value: " + encrypted);System.out.println("For properties file: ENC(" + encrypted + ")");}}
}

运行命令:

java -jar your-app.jar --jasypt.encryptor.password=your-secret-key your-value-to-encrypt

4.2 使用TestController的API

启动应用后,访问/encrypt/{value}接口来获取加密值。

五、注意事项和最佳实践

  1. 密钥管理:不要将密钥硬编码在代码或配置文件中,应使用环境变量、命令行参数或配置中心。

  2. 算法选择:Jasypt 3.0.0之后默认使用PBEWITHHMACSHA512ANDAES_256算法,需要JDK 9+或添加JCE支持。如果使用较低版本的JDK,可以选择兼容的算法如PBEWithMD5AndDES

  3. 版本兼容性:不同版本的Jasypt可能有不同的默认配置,升级时需要注意。

  4. 配置顺序:在YAML配置文件中,Jasypt的配置应放在最前面。

  5. 加密范围:只加密敏感信息,不必对所有配置进行加密。

  6. 测试验证:在部署前,确保加密的配置能够正确解密。

六、故障排除

6.1 启动时报错:Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String

这通常是因为Jasypt 3.0+默认使用的加密算法需要JDK 9+或JCE支持。解决方案:

  • 降级到Jasypt 2.x版本
  • 使用兼容的加密算法,如PBEWithMD5AndDES
  • 升级JDK到9或更高版本
  • 添加JCE支持

6.2 密文无法解密

  • 确保使用了正确的密钥
  • 确保加密和解密使用相同的算法和配置
  • 检查密文格式是否正确(是否包含ENC()

总结

通过整合Jasypt和Spring Boot,可以有效地保护配置文件中的敏感数据。本文提供了完整的代码示例和最佳实践,帮助开发者快速实现配置文件加密。在实际应用中,应根据项目需求和安全要求选择合适的集成方式和密钥管理策略。

Jasypt的简单易用性和与Spring Boot的无缝集成,使其成为保护配置文件敏感数据的理想选择。

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

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

相关文章

Better Faster Large Language Models via Multi-token Prediction 原理

目录 模型结构&#xff1a; Memory-efficient implementation&#xff1a; 实验&#xff1a; 1. 在大规模模型上效果显著&#xff1a; 2. 在不同类型任务上的效果&#xff1a; 为什么MLP对效果有提升的几点猜测&#xff1a; 1. 并非所有token对生成质量的影响相同 2. 关…

git merge解冲突后,add、continue提交

git merge解冲突后&#xff0c;add、continue提交 git merge操作冲突后&#xff0c;需要手动解冲突&#xff0c;解完冲突后&#xff0c;需要: git add . 然后&#xff0c;进入一般的正常git代码提交流程。 git合并‘merge’其他分支的个别文件到当前branch_gitbash 合并branc…

3.8.1 利用RDD实现词频统计

在本次实战中&#xff0c;我们通过Spark的RDD实现了词频统计功能。首先&#xff0c;准备了包含单词的文件并上传至HDFS。接着&#xff0c;采用交互式方式逐步完成词频统计&#xff0c;包括创建RDD、单词拆分、映射为二元组、按键归约以及排序等操作。此外&#xff0c;还通过创建…

应对进行性核上性麻痹,健康护理铸就温暖防线

进行性核上性麻痹&#xff08;PSP&#xff09;是一种罕见的神经退行性疾病&#xff0c;主要影响患者的运动、平衡及吞咽等功能。针对这类患者&#xff0c;有效的健康护理对提升其生活质量、延缓病情发展至关重要。 在日常生活护理方面&#xff0c;由于患者存在平衡障碍和肌肉僵…

融合蛋白质语言模型和图像修复模型,麻省理工与哈佛联手提出PUPS ,实现单细胞级蛋白质定位

蛋白质亚细胞定位&#xff08;subcellular localization of a protein&#xff09;是指蛋白质在细胞结构中具体的定位情况&#xff0c; 这对蛋白质行使其生物学功能至关重要。举个简单例子&#xff0c;如果把细胞想象成一个庞大的企业&#xff0c;其中细胞核、线粒体、细胞膜等…

lanqiaoOJ 4330:欧拉函数模板

【题目来源】 https://www.lanqiao.cn/problems/4330/learning/ 【问题描述】 这是一道模板题。 首先给出欧拉函数的定义&#xff1a;即 φ(n) 表示的是小于等于 n 的数中和 n 互质的数的个数。 比如说 φ(6)2&#xff0c;当 n 是质数的时候&#xff0c;显然有φ(n)n-1。 【题…

无人机电子防抖技术要点概述!

一、技术要点 1. 传感器数据融合 电子防抖需结合陀螺仪、加速度计、视觉传感器等多源数据&#xff0c;实时检测无人机的姿态变化和振动频率。例如&#xff0c;IMU&#xff08;惯性测量单元&#xff09;通过加速度计和陀螺仪测量飞行器的姿态和运动状态&#xff0c;结合视觉感…

Win10 安装单机版ES(elasticsearch),整合IK分词器和安装Kibana

一. 先查看本机windows是否安装了ES(elasticsearch)&#xff0c;检查方法如下&#xff1a; 检查进程 按 Ctrl Shift Esc 组合键打开 “任务管理器”。在 “进程” 选项卡中&#xff0c;查看是否有 elasticsearch 相关进程。如果有&#xff0c;说明系统安装了 ES。 检查端口…

BIO、NIO、AIO 的区别与实战应用解析

导语&#xff1a; BIO、NIO 和 AIO 是后端面试中的经典话题&#xff0c;尤其在高并发、高性能场景下更是重中之重。本文将从面试官视角出发&#xff0c;深入剖析三者的区别、典型题目和实战解答&#xff0c;助你掌握答题技巧&#xff0c;轻松拿下这一高频考点&#xff01; 一、…

电脑风扇转速不正常的原因

一、硬件故障或接触问题 1. 风扇本身损坏 扇叶卡顿或轴承磨损&#xff1a;灰尘堆积、异物缠绕&#xff08;如头发、线缆&#xff09;会导致扇叶转动阻力增大&#xff0c;发出异响并转速下降&#xff1b;轴承润滑脂干涸或老化会引起风扇噪音大、转速不稳定。电机故障&#xff…

运维打铁:生产服务器用户权限管理方案全解析

文章目录 一、引言二、方案设计2.1 权限模型选择2.2 角色定义2.3 权限分配2.4 用户与角色关联 三、相关代码注释&#xff08;以 Linux 系统为例&#xff09;3.1 用户创建与角色分配脚本3.2 权限设置脚本 四、常见问题解决4.1 用户无法登录4.2 用户权限不足4.3 权限文件修改后不…

在tp6模版中加减法

实际项目中&#xff0c;我们经常需要标签变量加减运算的操作。但是&#xff0c;在ThinkPHP中&#xff0c;并不支持模板变量直接运算的操作。幸运的是&#xff0c;它提供了自定义函数的方法&#xff0c;我们可以利用自定义函数解决&#xff1a;ThinkPHP模板自定义函数语法如下&a…

Fastjson利用链JdbcRowSetImpl分析

首先创建客户端 package com.yq1ng.vul;import com.alibaba.fastjson.JSON;/*** FastJsonTest** author yq1ng* date 2021/12/29 19:45* since 1.0.0*/ public class FastJsonTest {public static void main(String[] args) {String ser "{\"type\":\"co…

基于OAuth2-proxy和Keycloak为comfyui实现SSO

背景 comfyui无认证被漏扫后易被rce挖矿 攻击过程 https://www.oschina.net/news/340226 https://github.com/comfyanonymous/ComfyUI/discussions/5165 阿里云漏洞库关于comfyui的漏洞 https://avd.aliyun.com/search?qcomfyui&timestamp__1384n4%2BxBD0GitGQ0QD8ID%2F…

第R7周:糖尿病预测模型优化探索

文章目录 1.数据预处理1.1 设置GPU1.2 数据导入1.3 数据检查 2. 数据分析2.1 数据分布分析2.2 相关性分析 3. LSTM模型3.1 划分数据集3.2 数据集构建3.3 定义模型 4. 训练模型4.1 定义训练函数4.2 定义测试函数4.3 训练模型 5. 模型评估5.1 Loss与Accuracy图 6. 总结 &#x1f…

一些好用的Chrome 扩展程序

以下是按主要功能分类的 Chrome 扩展程序列表&#xff0c;包括其版本号、中文功能简述以及指向其主页或 Chrome 网上应用店页面的链接。 翻译与语言 沉浸式翻译 - 网页翻译插件 | PDF 翻译 | 免费 版本: 1.16.12 描述: 【沉浸式翻译】免费的&#xff08;原文 / 译文&#xff0…

贪心算法题目合集2

贪心算法题目合集2 一般排序排队接水整数区间金银岛寻找平面上的极大点NOIP 2008 普及组 排座椅 推导排序规律NOIP 1998 提高组 拼数排序规则的正确性证明&#xff1a;全序关系证明拼数的贪心策略正确P2878 [USACO07JAN] Protecting the Flowers SP1842 [USACO05NOV] 奶牛玩杂技…

全方位详解微服务架构中的Service Mesh(服务网格)

一、引言 随着微服务架构的广泛应用&#xff0c;微服务之间的通信管理、流量控制、安全保障等问题变得日益复杂。服务网格&#xff08;Service Mesh&#xff09;作为一种新兴的技术&#xff0c;为解决这些问题提供了有效的方案。它将服务间通信的管理从微服务代码中分离出来&a…

如何在VSCode中更换默认浏览器:完整指南

引言 作为前端开发者&#xff0c;我们经常需要在VSCode中快速预览HTML文件。默认情况下&#xff0c;VSCode会使用系统默认浏览器打开文件&#xff0c;但有时我们可能需要切换到其他浏览器进行测试。本文将详细介绍如何在VSCode中更换默认浏览器。 方法一&#xff1a;使用VSCo…

【普及+/提高】洛谷P2613 【模板】有理数取余——快读+快速幂

题目来源 P2613 【模板】有理数取余 - 洛谷 题目描述 给出一个有理数 cba​&#xff0c;求 cmod19260817 的值。 这个值被定义为 bx≡a(mod19260817) 的解。 输入格式 一共两行。 第一行&#xff0c;一个整数 a。 第二行&#xff0c;一个整数 b。 输出格式 一个整数&a…