当前位置: 首页 > news >正文

spring boot集成jasypt 并 实现自定义加解密

一. 技术需求

由于项目中的配置文件 配置的地方过多,现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中

项目中组件使用的版本环境如下
spring cloud 2021.0.5
spring cloud alibaba 2021.0.5.0
spring boot 2.6.13

二. 技术实现

配置文件的加密使用 加密库 jasypt

三. 简单使用步骤

  • 引入maven依赖

    <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version>
    </dependency>
    
  • 添加配置

    #加解密使用的密码 可以理解为密钥
    jasypt.encryptor.password=12581
    
  • 使用jasypt配置的密码来加密密码 并替换配置原先密码 (提供工具类进行加密)

    #原密码
    spring.datasource.passsword=1232456
    #新的密码 其实 rngDAJwRU09A3oNLkxzNaP3wfyhHt5N4DPAjudNJKDYAWXDeFmdGcFvgZJSh4gqZ 为源密码加密后的值
    spring.datasource.password=ENC(rngDAJwRU09A3oNLkxzNaP3wfyhHt5N4DPAjudNJKDYAWXDeFmdGcFvgZJSh4gqZ)
    

工具类如下

@Slf4j
public class Custom {public static void main(String[] args) {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();//TODO 替换为配置文件中的密码config.setPassword("12581");//默认的加密算法config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");config.setKeyObtentionIterations("1000");config.setPoolSize("1");config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");config.setStringOutputType("base64");encryptor.setConfig(config);//TODO 123456 替换为所需加密的 原文String encrypt = encryptor.encrypt("123456");log.info("encrypt: {}", encrypt);}
}

到此就完成基本的配置文件加解密

你以为结束了吗,no~~~~

四. 高级使用篇

上面使用的默认的加解密的工具类,但是jasypt.encryptor.password 还是需要配置在配置文件中的 (配置文件、jvm参数等)本质来讲还是容易统一泄露。到这里,可能就有灵感了。不如我们自定义的加密的工具类 复杂的话 也可以搞个非对称加密(这个可自行研究)

目前我们来使用下 自定义加密的工具

(1)首先实现自定义的加密工具 需要实现 StringEncryptor 即可 我们这是用的国密4的对称加密算法 同时使用了 hutool的工具类

import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.SM4;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.jasypt.encryption.StringEncryptor;import java.nio.charset.StandardCharsets;/*** @author leon* @date 2023-08-19 10:54:32*/
@Slf4j
public class Sm4Encryptor implements StringEncryptor {private static final SM4 SM_4;static {byte[] key = "1234567891234560".getBytes();byte[] iv = "1234567891234560".getBytes();SM_4 = new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv);}@Overridepublic String encrypt(String message) {return SM_4.encryptHex(message);}@Overridepublic String decrypt(String encryptedMessage) {return SM_4.decryptStr(encryptedMessage);}public static void main(String[] args) {String originalValue = "123456";String encrypted = SM_4.encryptHex(originalValue);String decrypted = SM_4.decryptStr(encrypted);log.info("Original Value: {}" , originalValue);log.info("Encrypted Value: {}" , encrypted);log.info("Decrypted Value: {}", decrypted);}}

(2)注册该bean 这需要使用特殊的方式注册bean 因为我们希望在 Spring Boot 应用程序启动期间提前将自定义的加解密类添加到 Spring 的应用程序上下文中,以便在配置文件加载之前,加解密类已经可用。这样可以确保配置文件中的加密属性能够在加载时使用正确的自定义加解密逻辑进行解密

新建初始化类

import com.stlye.encryptor.Sm4Encryptor;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;/*** @date 2023-08-21 13:57:20* @author leon*/
public class CustomContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {applicationContext.getBeanFactory().registerSingleton("encryptorBean", new Sm4Encryptor());}
}

其次在resource 下新建 META_INF文件夹 并新建 spring.factories 文件

org.springframework.context.ApplicationContextInitializer=com.style.order.config.CustomContextInitializer

(3)调整配置

#移除该配置 
jasypt.encryptor.password=12581#新增如下配置 自定义加解密工具的bean名称 
jasypt.encryptor.bean=encryptorBean

(4) 使用该工具类生成需要加密的内容 并替换 原配置文件中的内容

#其中cab60ba208f8a7d87c4f631e2763607a为源密码加密后的内容
spring.datasource.password=ENC(cab60ba208f8a7d87c4f631e2763607a)#另外属性解密的前缀和后缀都是支持自定义 默认如下
jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix=)

到这里就完成配置的文件的加密 你肯定会好奇,解密需要我们自己做么,回答当然不需要,这个框架中已经自动帮我们进行了解密

具体的实现原理可看源码类 EnableEncryptablePropertiesBeanFactoryPostProcessor 和 EncryptablePropertyResolverConfiguration 两大核心类 本质上来讲也是动态代理。

以下是国密4加密算法的参数介绍


密码的加密算法选择了 SM4 国密的对称加密算法

内置参数 模式和补码方式对比如下

//不同的模式和补码方式在加密算法中有不同的作用,它们会影响加密和解密的行为以及安全性。下面我会简要解释一下不同模式和补码方式的区别,并提供一些关于安全性的信息:
//
//**模式(Mode)**:
//加密模式定义了数据块之间是如何加密的,它影响到同一消息分成多个数据块时的加密方式。以下是一些常见的加密模式:
//
//1. **ECB(Electronic Codebook)**:每个数据块都独立加密,相同的输入会得到相同的输出。不适合加密大量数据,安全性较差。
//
//2. **CBC(Cipher Block Chaining)**:前一个数据块的加密结果会与当前数据块一起进行加密。需要一个初始化向量(IV)来增加安全性。
//
//3. **CFB(Cipher Feedback)**:前一个密文块被解密并与当前明文块进行异或操作,然后再进行加密。不需要 IV。
//
//4. **OFB(Output Feedback)**:类似于 CFB,但是前一个密文块只用于生成密钥流,不直接与明文块进行操作。不需要 IV。
//
//5. **CTR(Counter)**:将 IV 与一个计数器组合,生成密钥流,然后与明文块进行异或操作。不需要 IV。
//
//**补码方式(Padding)**:
//补码方式是在加密块大小与数据大小不匹配时,如何填充数据块的方式。以下是一些常见的补码方式:
//
//1. **NoPadding**:不进行任何填充,要求明文的大小必须是加密块大小的倍数。
//
//2. **PKCS5Padding** / **PKCS7Padding**:在数据块的末尾填充字节,字节的值等于需要填充的字节数。
//
//3. **ISO10126Padding**:在数据块的末尾填充随机字节,最后一个字节指示填充的字节数。
//
//4. **ZeroBytePadding**:在数据块的末尾填充零字节。
//
//**安全性评估**:
//安全性评估涉及多个因素,包括加密算法的强度、密钥的管理、数据传输的安全性等。在选择加密模式和补码方式时,要根据具体的应用场景和安全需求进行权衡。一般而言,以下是一些建议:
//
//- **模式选择**:CBC 模式相对较为常见和安全,适用于大多数场景。CTR 也是一种常见的选择,适合并行加解密。
//
//- **补码方式选择**:PKCS7Padding / PKCS5Padding 是常见的选择,它们会根据需要填充的字节数进行填充,相对比较安全。
//
//总之,选择加密模式和补码方式时,应该综合考虑性能、安全性和适用性。在设计和实现加密系统时,最好参考专业的加密标准和最佳实践,以确保数据的安全性。

其中安全性较高 mode参数可选择值的是 CBC / GCM

在国密4(SM4)加密算法中,GCM(Galois/Counter Mode)和CBC(Cipher Block Chaining)都是加密模式,用于定义不同的加密操作方式。它们有一些区别,包括加密过程、性能、安全性等方面。

  1. GCM模式(Galois/Counter Mode):

    • GCM是一种高级的分组加密模式,除了提供加密和解密功能外,还具有认证和完整性校验的能力。
    • GCM模式在加密过程中会使用一个称为"Nonce"的值,用于确保每个加密操作的唯一性,避免重复使用Nonce导致的安全问题。
    • GCM模式可以同时进行加密和认证,因此在一些场景中可以减少通信的复杂性和性能开销。
    • 由于GCM模式的性能较高且提供了认证能力,通常在需要较高性能和安全性的场景中被使用。
  2. CBC模式(Cipher Block Chaining):

    • CBC是一种较为传统的分组加密模式,每个分组的密文会依赖于前一个分组的明文,因此具有一定的关联性。
    • CBC模式需要在加密前进行填充操作,以适应固定长度的分组大小。
    • 由于每个分组的加密都依赖于前一个分组的密文,所以在并行处理时可能存在性能上的限制。
    • CBC模式通常需要额外的认证步骤来保证数据完整性和安全性。

性能方面,GCM模式通常在处理大量数据时具有更好的性能,因为它可以同时进行加密和认证,而且不需要像CBC那样需要明确的填充步骤。然而,由于GCM模式引入了额外的认证计算,对于较小的数据块,GCM的性能可能会略逊于CBC。

选择合适的加密模式取决于具体的应用场景和需求。如果你需要高性能和认证能力,可以考虑使用GCM模式。如果你更关注传统的分组加密模式,并且不需要认证能力,可以选择CBC模式。

GCM 由于使用一个称为"Nonce"的值,每次加密都需要保证唯一 ,每次需要新建实例 ,避免重复使用Nonce导致的安全问题 这就导致了性能来讲可能稍逊于 CBC 且GCM模式 不需要补码

相关文章:

spring boot集成jasypt 并 实现自定义加解密

一. 技术需求 由于项目中的配置文件 配置的地方过多&#xff0c;现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中 项目中组件使用的版本环境如下 spring cloud 2021.0.5 spring cloud alibaba 2021.0.5.0 spring boot 2.6.13 二. 技术实现 配置文…...

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…...

MME: A Comprehensive Evaluation Benchmark for Multimodal Large Language Models

本文也是LLM系列相关文章&#xff0c;针对《MME: A Comprehensive Evaluation Benchmark for Multimodal Large Language Models》的翻译。 MME:一个多模态大型语言模型的综合评估基准 摘要1 引言2 MME评估套件3 实验4 分析5 结论 摘要 多模态大语言模型&#xff08;MLLM&…...

学习开发振弦采集模块的注意事项

学习开发振弦采集模块的注意事项 &#xff08;三河凡科科技/飞讯教学&#xff09;振弦采集模块是一种用来实时采集和处理振弦信号的电子设备&#xff0c;在工业、航空、医疗等领域都有广泛应用。学习开发振弦采集模块需要注意以下几点&#xff1a; 一、硬件选择 首先需要选择…...

抵御时代风险:高级安全策略与实践

目录 网页篡改攻击 流量攻击 数据库攻击 恶意扫描攻击 域名攻击 在今天的数字时代&#xff0c;网站已经成为企业、机构和个人展示信息、交流互动的重要平台。然而&#xff0c;随着网络攻击技术的不断进步&#xff0c;网站也面临着各种安全威胁。本文将探讨五种常见的网络攻…...

(3)、SpringCache源码分析

1、入口说明 @EnableCaching是开启SpringCache的一个总开关,开启时候我们的缓存相关注解才会生效,所以我们@EnableCaching开始作为入口进行分析, 2、分析@EnableCaching注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(...

如何在 Ubuntu 中安装最新的 Python 版本

动动发财的小手&#xff0c;点个赞吧&#xff01; Python 是增长最快的主要通用编程语言。其原因有很多&#xff0c;例如其可读性和灵活性、易于学习和使用、可靠性和效率。 目前使用的 Python 有两个主要版本 – 2 和 3&#xff08;Python 的现在和未来&#xff09;&#xff1…...

等保测评--安全物理环境--测评方法

安全子类--物理位置选择 a)机房场地应选择在具有防震、防风和防雨等能力的建筑内; 一、测评对象 记录类文档和机房 二、测评实施 1)检查机房所在建筑物是否具有建筑物抗震设防审批文档; 2)检查机房门窗是否不存在因风导致的尘土严重; 3)检查机房是否不存在雨水渗漏…...

解决jmeter导入jmx文件报错方法

有的时候我们导入别人的jmx文件&#xff0c;但是在导入的时候会报错&#xff0c;如下图&#xff1a; 这是缺少jmeter插件jar包所引起的&#xff0c;下载对应jar包放到jmeter安装目录对应的lib/ext下就可以了。可以通过插件管理工具包下载安装&#xff0c;也可以直接下载对应的…...

CH32V307 开启浮点后rtthread的修改

官方版本是3.1.3&#xff0c;而且只有整数的&#xff0c;开启浮点后要做一些修改&#xff0c;这里问了官方并贴出来方便大家使用&#xff1a; 首先在mounriver开启浮点&#xff0c;步骤&#xff1a; 开启浮点&#xff1a;ide 开启float point->rvf, floating point abi->…...

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到&#xff0c;一定要会172.22.141.231/26&#xff0c;该IP位于哪个网段&#xff1f; 该网段拥有多少可用IP地址&#xff1f;广播地址是多少&#xff1f; 解题思路&#xff1a; 网络地址&#xff1a;172.22.141.192 10101100.00010110.10001101.11000000 广播…...

macOS nginx部署前端项目

1、安装nginx&#xff1b; brew install nginx2、配置nginx&#xff0c;主要配置代码&#xff0c;服务器代理 1、配置文件地址 根目录是 macOS 文件系统的最顶层目录。您可以在 Finder 中使用快捷键 Shift Command G&#xff0c;然后输入 /usr&#xff0c;即可直接打开 /u…...

管理类联考——逻辑——真题篇——按知识分类——汇总篇——二、论证逻辑——削弱——第一节 推理论证

文章目录 第七章 削弱质疑第一节 削弱-题型1-推理论证-论证为预测结果题-削弱质疑-预测-推理论证-分类1-削弱论点真题(2019-24)-削弱质疑-预测-推理论证-分类1-削弱论点真题(2019-42)-削弱质疑-预测-推理论证-分类1-削弱论点真题(2011-32)-削弱质疑-预测-推理论证-分类…...

LoRa 网络的高效自适应数据链路层架构

介绍 LoRa 是用于实现物联网的最流行的低功耗无线网络技术之一,与 Zigbee 或蓝牙等技术相比,其优点是提供远距离通信,但数据速率较低。LoRa 是一种单通道物理层技术,LoRaWAN 在此基础上实现了更复杂的多通道网络,并具有增强的功能,例如自适应数据速率。然而,LoRaWAN 依赖…...

Ubuntu软件源、pip源大全,国内网站网址,阿里云、网易163、搜狐、华为、清华、北大、中科大、上交、山大、吉大、哈工大、兰大、北理、浙大

文章目录 一、企业镜像源1、阿里云2、网易1633、搜狐镜像4、华为 二&#xff1a;高校镜像源1、清华源2、北京大学3、中国科学技术大学源 &#xff08;USTC&#xff09;4、 上海交通大学5、山东大学6、 吉林大学开源镜像站7、 哈尔滨工业大学开源镜像站8、 西安交通大学软件镜像…...

4 Python的函数

概述 在上一节&#xff0c;我们介绍了Python的数据类型&#xff0c;包括&#xff1a;数字、字符串、列表、元组、集合、字典等内容。在本节中&#xff0c;我们将介绍Python的函数。在Python中&#xff0c;函数是一段可以重复使用的代码块&#xff0c;它可以提高代码的可重用性和…...

Claude 2 国内镜像站

Claudeai是什么&#xff1f; Claude 2被称为ChatGPT最强劲的竞争对手&#xff0c;支持100K上下文对话&#xff0c;并且可以同时和5个文档进行对话&#xff0c;不过国内目前无法正常实用的&#xff0c;而claudeai是一个Claude 2 国内镜像站&#xff0c;并且免翻可用&#xff0…...

MySQL的基础操作

前言 对MySQL的一些基础操作做一下学习性的总结&#xff0c;基本上是照着视频写的。 MySQL的安装 MySQL的下载 MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 配置环境变量 下载之后直接解压&#xff0c…...

Dockerfile快速搭建自己专属的LAMP环境

目录 编写Dockerfile 1.文件内容需求&#xff1a; 2.值得注意的是centos6官方源已下线&#xff0c;所以需要切换centos-vault源&#xff01; 3.Dockerfile内容 4.进入到 lamp 开始构建镜像 推送镜像到私有仓库 1.创建用户并添加到私有仓库&#xff1a;​编辑​编辑 2.推…...

秒懂算法│博弈论

博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论。博弈论是研究互动决策的理论。博弈可以分析自己与对手的利弊关系,从而确立自己在博弈中的优势,因此有不少博弈理论,可以帮助对弈者分析局势,从而采取相应策略,最终达到取胜的目的。…...

Springboot整合RabbitMQ消息中间件

spring-boot-rabbitmq–消息中间件整合 前言&#xff1a;RabbitMQ的各种交换机说明 1、直连交换机 生产者发布消息时必须带着routing-key&#xff0c;队列绑定到交换机时必须指定binding-key ,且routing-key和binding-key必须完全相同&#xff0c;如此才能将消息路由到队列中…...

基于springboot+vue的食材商城(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

Maven解析

目录 Maven的概念 Pom 项目坐标 仓库 Maven环境搭建 安装jdk 配置maven 配置本地仓库地址 配置阿里云 maven 镜像仓库&#xff0c;下载速度更快 在idea中配置maven ​编辑 pom中名词解释 Maven命令 Maven的概念 Maven 是 Apache 软件基金会的一个开源项目,是一个…...

如何使用数学将 NumPy 函数的性能提高 50%

一、说明 2D 傅里叶变换是本世纪最重要的计算机科学算法之一。它已在我们的日常生活中得到应用&#xff0c;从Instagram过滤器到MP3文件的处理。 普通用户最常用的实现&#xff0c;有时甚至是在不知不觉中&#xff0c;是 NumPy 的改编。然而&#xff0c;尽管它很受欢迎&#xf…...

群狼调研(长沙政策第三方评估)| 社情民意调查的内容

本文由群狼调研(长沙社会舆情调查)出品&#xff0c;欢迎转载&#xff0c;请注明出处。社情民意调查旨在捕捉公众对各种社会问题的态度、意见和看法&#xff0c;社情民意调查的内容通常包括以下几个方面&#xff1a; 1. 社会热点问题&#xff1a;针对当前社会热点问题进行调查&…...

【三维重建】【深度学习】NeuS代码Pytorch实现--测试阶段代码解析(上)

【三维重建】【深度学习】NeuS代码Pytorch实现–测试阶段代码解析(上) 论文提出了一种新颖的神经表面重建方法&#xff0c;称为NeuS&#xff0c;用于从2D图像输入以高保真度重建对象和场景。在NeuS中建议将曲面表示为有符号距离函数(SDF)的零级集&#xff0c;并开发一种新的体绘…...

day-24 代码随想录算法训练营(19)回溯part01

77.组合 思路一&#xff1a;回溯相当于枚举&#xff0c;所以我们遍历1-n的每一个数字&#xff0c;然后在遍历第i位的同时递归出第i1~n位的组合结果&#xff0c;跟树的形式相似。 如上图所示&#xff0c;当长度为k时&#xff0c;即退出递归可对遍历到第i位以及剩下位数与k进行比…...

Redis之SYNC与PSYNC命令

一、复制SYNC与PSYNC 在Redis主从架构中&#xff0c;主要有以下两种情形需要进行数据同步 &#xff08;1&#xff09;当新的服务器执行slave of 命令&#xff0c;成为主服务器的从服务器。这时候从服务器会向主服务器发送SYNC命令&#xff0c;请求全量同步数据&#xff0c;主服…...

共创无线物联网数字化新模式|协创数据×企企通采购与供应链管理平台项目成功上线

近日&#xff0c;全球无线物联网领先者『协创数据技术股份有限公司』&#xff08;以下简称“协创数据”&#xff09;SRM采购与供应链项目全面上线&#xff0c;并于近日与企企通召开成功召开项目上线总结会。 基于双方资源和优势&#xff0c;共同打造了物联网特色的数字化采购供…...

【深入理解jvm读书笔记】jvm如何进行内存分配

jvm如何进行内存分配 内存分配方式内存分配方式的选择并发场景下的内存分配内存空间的初始化构造函数 内存分配方式 指针碰撞空闲列表 指针碰撞法&#xff1a; 假设Java堆中内存是绝对规整的&#xff0c;所有被使用过的内存都被放在一边&#xff0c;空闲的内存被放在另一边&a…...

铜仁市网站建设情况/网络营销的模式有哪些?

【题解】 我们可以发现每次修改之后叶子结点到根的路径最多分为两段&#xff1a;一段白色或者黑色&#xff0c;上面接另一段灰色的。二分倍增找到分界点&#xff0c;然后更新答案即可。 check的时候只需要判断当前节点对应的叶子结点的区间是否全部为同一种颜色&#xff0c;用树…...

汕头市网站建设分站公司/流量平台有哪些

https://jingyan.baidu.com/article/8275fc86773b2446a03cf6f1.html...

宁波应用多的建站行业/百度数据研究中心

相关文章导航Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8> 今天发现一个好地方,可以提供MSN在线状态代码&#xff0c;还…...

平台网站做代理商/长春刚刚最新消息今天

APP说明中国国家基本比例尺地形图有七种&#xff1a;1:100万、1:50万、1:25万、1:10万、1:5万、1:2.5万和1:1万&#xff1b;普通地图按比例尺通常分为大中小三种&#xff1a;小于100万(小比例尺)&#xff0c;10万到100万(中比例尺)&#xff0c;大于10万(大比例尺)。地图分幅是指…...

深圳外贸电商网站建设/企业建站都有什么网站

1.input()接受各种合法类型的输入&#xff0c;比如输入字符串&#xff0c;则需要使用双引号,否则报错。 input()会自动判断类型&#xff0c;比如输入的是 1.1&#xff0c;则返回的类型是float。 示例&#xff1a; 2.raw_input() raw_input()也接受各种类型的输入&#xff0c;不…...

高端网站定制开发/墨子学院seo

在亚里士多德看来&#xff0c;凡物皆有自己&#xff0c;凡物皆有自身的本质&#xff0c;这些本质就构成了一个逻辑链条。我们把握住每件事物的内在逻辑链条&#xff0c;就把握了这个世界的理性构造。所以他不愿意把质还原为量。他愿意呵护每件事物。他愿意让石头成为石头&#…...