抚松做网站wordpress小程序二开

news/2025/9/29 20:17:27/文章来源:
抚松做网站,wordpress小程序二开,icp域名备案查询,wordpress个性主题这几天公司在排查内部数据账号泄漏#xff0c;原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub上#xff0c;导致核心数据外漏#xff0c;孩子还是没挨过社会毒打#xff0c;这种事的后果可大可小。说起这个我是比较有感触的#xff0c;之前我TM被删库… 这几天公司在排查内部数据账号泄漏原因是发现某些实习生小可爱居然连带着账号、密码将源码私传到GitHub上导致核心数据外漏孩子还是没挨过社会毒打这种事的后果可大可小。说起这个我是比较有感触的之前我TM被删库的经历到现在想起来心里还难受我也是把数据库账号明文密码误提交到GitHub然后被哪个大宝贝给我测试库删了后边我长记性了把配置文件内容都加密了数据安全问题真的不容小觑不管工作汇还是生活敏感数据一定要做脱敏处理。所以接下来咱们需要开展两方面的工作对配置文件进行脱敏操作对敏感的数据库字段进行脱敏操作。说干就干接下来咱们一起来对项目进行脱敏操作。1.配置脱敏实现配置的脱敏我使用了Java的一个加解密工具Jasypt它提供了单密钥对称加密和非对称加密两种脱敏方式。单密钥对称加密一个密钥加盐可以同时用作内容的加密和解密依据非对称加密使用公钥和私钥两个密钥才可以对内容加密和解密以上两种加密方式使用都非常简单咱们以springboot集成单密钥对称加密方式做示例。首先引入jasypt-spring-boot-starter jar !--配置文件加密--dependencygroupIdcom.github.ulisesbocchio/groupIdartifactIdjasypt-spring-boot-starter/artifactIdversion2.1.0/version/dependency 配置文件加入秘钥配置项jasypt.encryptor.password并将需要脱敏的value值替换成预先经过加密的内容ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)。这个格式我们是可以随意定义的比如想要abc[mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l]格式只要配置前缀和后缀即可。jasypt:encryptor:property:prefix: abc[suffix: ] ENC(XXX格式主要为了便于识别该值是否需要解密如不按照该格式配置在加载配置项的时候jasypt将保持原值不进行解密。spring:datasource:url: jdbc:mysql://1.2.3.4:3306/xiaofu?useSSLfalseuseUnicodetruecharacterEncodingUTF-8autoReconnecttrueze oDateTimeBehaviorconvertToNullserverTimezoneAsia/Shanghaiusername: xiaofupassword: ENC(mVTvp4IddqdaYGqPl9lCQbzM3H/b0B6l)# 秘钥 jasypt:encryptor:password: 程序员内点事(然而不支持中文) 秘钥是个安全性要求比较高的属性所以一般不建议直接放在项目内可以通过启动时-D参数注入或者放在配置中心避免泄露。java -jar -Djasypt.encryptor.password1123  springboot-jasypt-2.3.3.RELEASE.jar 预先生成的加密值可以通过代码内调用API生成Autowired private StringEncryptor stringEncryptor;public void encrypt(String content) {String encryptStr  stringEncryptor.encrypt(content);System.out.println(加密后的内容  encryptStr); } 或者通过如下Java命令生成几个参数D:\maven_lib\org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar为jasypt核心jar包input待加密文本password秘钥algorithm为使用的加密算法。java -cp  D:\maven_lib\org\jasypt\jasypt\1.9.3\jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI inputroot passwordxiaofu  algorithmPBEWithMD5AndDES 一顿操作后如果还能正常启动说明配置文件脱敏就没问题了。2.敏感字段脱敏生产环境用户的隐私数据比如手机号、身份证或者一些账号配置等信息入库时都要进行不落地脱敏也就是在进入我们系统时就要实时的脱敏处理。用户数据进入系统脱敏处理后持久化到数据库用户查询数据时还要进行反向解密。这种场景一般需要全局处理那么用AOP切面来实现在适合不过了。首先自定义两个注解EncryptField、EncryptMethod分别用在字段属性和方法上实现思路很简单只要方法上应用到EncryptMethod注解则检查入参字段是否标注EncryptField注解有则将对应字段内容加密。Documented Target({ElementType.FIELD,ElementType.PARAMETER}) Retention(RetentionPolicy.RUNTIME) public interface EncryptField {String[] value() default ; } Documented Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface EncryptMethod {String type() default ENCRYPT; } 切面的实现也比较简单对入参加密返回结果解密。为了方便阅读这里就只贴出部分代码完整案例Github地址https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-jasyptSlf4j Aspect Component public class EncryptHandler {Autowiredprivate StringEncryptor stringEncryptor;Pointcut(annotation(com.xiaofu.annotation.EncryptMethod))public void pointCut() {}Around(pointCut())public Object around(ProceedingJoinPoint joinPoint) {/*** 加密*/encrypt(joinPoint);/*** 解密*/Object decrypt  decrypt(joinPoint);return decrypt;}public void encrypt(ProceedingJoinPoint joinPoint) {try {Object[] objects  joinPoint.getArgs();if (objects.length ! 0) {for (Object o : objects) {if (o instanceof String) {encryptValue(o);} else {handler(o, ENCRYPT);}//TODO 其余类型自己看实际情况加}}} catch (IllegalAccessException e) {e.printStackTrace();}}public Object decrypt(ProceedingJoinPoint joinPoint) {Object result  null;try {Object obj  joinPoint.proceed();if (obj ! null) {if (obj instanceof String) {decryptValue(obj);} else {result  handler(obj, DECRYPT);}//TODO 其余类型自己看实际情况加}} catch (Throwable e) {e.printStackTrace();}return result;}。。。 } 紧接着测试一下切面注解的效果我们对字段mobile、address加上注解EncryptField做脱敏处理。EncryptMethod PostMapping(value  test) ResponseBody public Object testEncrypt(RequestBody UserVo user, EncryptField String name) {return insertUser(user, name); }private UserVo insertUser(UserVo user, String name) {System.out.println(加密后的数据user  JSON.toJSONString(user));return user; }Data public class UserVo implements Serializable {private Long userId;EncryptFieldprivate String mobile;EncryptFieldprivate String address;private String age; } 请求这个接口看到参数被成功加密而返回给用户的数据依然是脱敏前的数据符合我们的预期那到这简单的脱敏实现就完事了。3.原理分析Jasypt工具虽然简单好用但作为程序员我们不能仅满足于熟练使用底层实现原理还是有必要了解下的这对后续调试bug、二次开发扩展功能很重要。个人认为Jasypt配置文件脱敏的原理很简单无非就是在具体使用配置信息之前先拦截获取配置的操作将对应的加密配置解密后再使用。具体是不是如此我们简单看下源码的实现既然是以springboot方式集成那么就先从jasypt-spring-boot-starter源码开始入手。starter代码很少主要的工作就是通过SPI机制注册服务和Import注解来注入需前置处理的类JasyptSpringBootAutoConfiguration。在前置加载类EnableEncryptablePropertiesConfiguration中注册了一个核心处理类EnableEncryptablePropertiesBeanFactoryPostProcessor。它的构造器有两个参数ConfigurableEnvironment用来获取所有配属信息EncryptablePropertySourceConverter对配置信息做解析处理。顺藤摸瓜发现具体负责解密的处理类EncryptablePropertySourceWrapper它通过对Spring属性管理类PropertySourceT做拓展重写了getProperty(String name)方法在获取配置时凡是指定格式如ENC(x) 包裹的值全部解密处理。既然知道了原理那么后续我们二次开发比如切换加密算法或者实现自己的脱敏工具就容易的多了。“案例Github地址https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-jasyptPBE算法再来聊一下Jasypt中用的加密算法其实它是在JDK的JCE.jar包基础上做了封装本质上还是用的JDK提供的算法默认使用的是PBE算法PBEWITHMD5ANDDES看到这个算法命名很有意思段个句看看PBE、WITH、MD5、AND、DES 好像有点故事继续看。PBE算法Password Based Encryption基于口令密码的加密是一种基于口令的加密算法其特点在于口令是由用户自己掌握在加上随机数多重加密等方法保证数据的安全性。PBE算法本质上并没有真正构建新的加密、解密算法而是对我们已知的算法做了包装。比如常用的消息摘要算法MD5和SHA算法对称加密算法DES、RC2等而PBE算法就是将这些算法进行合理组合这也呼应上前边算法的名字。既然PBE算法使用我们较为常用的对称加密算法那就会涉及密钥的问题。但它本身又没有钥的概念只有口令密码密钥则是口令经过加密算法计算得来的。口令本身并不会很长所以不能用来替代密钥只用口令很容易通过穷举攻击方式破译这时候就得加点盐了。盐通常会是一些随机信息比如随机数、时间戳将盐附加在口令上通过算法计算加大破译的难度。源码里的猫腻简单了解PBE算法回过头看看Jasypt源码是如何实现加解密的。在加密的时候首先实例化秘钥工厂SecretKeyFactory生成八位盐值默认使用的jasypt.encryptor.RandomSaltGenerator生成器。public byte[] encrypt(byte[] message) {// 根据指定算法初始化秘钥工厂final SecretKeyFactory factory  SecretKeyFactory.getInstance(algorithm1);// 盐值生成器只选八位byte[] salt  saltGenerator.generateSalt(8);// final PBEKeySpec keySpec  new PBEKeySpec(password.toCharArray(), salt, iterations);// 盐值、口令生成秘钥SecretKey key  factory.generateSecret(keySpec);// 构建加密器final Cipher cipherEncrypt  Cipher.getInstance(algorithm1);cipherEncrypt.init(Cipher.ENCRYPT_MODE, key);// 密文头部盐值byte[] params  cipherEncrypt.getParameters().getEncoded();// 调用底层实现加密byte[] encryptedMessage  cipherEncrypt.doFinal(message);// 组装最终密文内容并分配内存盐值密文return ByteBuffer.allocate(1  params.length  encryptedMessage.length).put((byte) params.length).put(params).put(encryptedMessage).array(); } 由于默认使用的是随机盐值生成器导致相同内容每次加密后的内容都是不同的。那么解密时该怎么对应上呢看上边的源码发现最终的加密文本是由两部分组成的params消息头里边包含口令和随机生成的盐值encryptedMessage密文。加密而在解密时会根据密文encryptedMessage的内容拆解出params内容解析出盐值和口令在调用JDK底层算法解密出实际内容。Override SneakyThrows public byte[] decrypt(byte[] encryptedMessage) {// 获取密文头部内容int paramsLength  Byte.toUnsignedInt(encryptedMessage[0]);// 获取密文内容int messageLength  encryptedMessage.length - paramsLength - 1;byte[] params  new byte[paramsLength];byte[] message  new byte[messageLength];System.arraycopy(encryptedMessage, 1, params, 0, paramsLength);System.arraycopy(encryptedMessage, paramsLength  1, message, 0, messageLength);// 初始化秘钥工厂final SecretKeyFactory factory  SecretKeyFactory.getInstance(algorithm1);final PBEKeySpec keySpec  new PBEKeySpec(password.toCharArray());SecretKey key  factory.generateSecret(keySpec);// 构建头部盐值口令参数AlgorithmParameters algorithmParameters  AlgorithmParameters.getInstance(algorithm1);algorithmParameters.init(params);// 构建加密器调用底层算法final Cipher cipherDecrypt  Cipher.getInstance(algorithm1);cipherDecrypt.init(Cipher.DECRYPT_MODE,key,algorithmParameters);return cipherDecrypt.doFinal(message); } 解密我是磊哥如果对你有用在看、关注支持下咱们下期见~ 往期推荐 SpringBoot 如何统一后端返回格式老鸟们都是这样玩的SpringBoot时间格式化的5种方法SpringBoot 优雅的参数效验

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

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

相关文章

湘潭网站建设出色磐石网络网站搭建详细教程

泛型&#xff0c;英文是generic。 泛型是一种参数化多态。就是把类型作为参数&#xff0c;使用时才指定具体类型。 这样一套代码可以应用于多种类型。比如Vec<T>&#xff0c;可以是整型向量Vec<i32>&#xff0c;也可以是浮点型向量Vec<f64>。 Rust中的泛型属…

重庆微信网站代理商把数据库wordpress

springboot注解扫描范围是由ComponentScan指定的;默认情况下为启动程序所在目录及其子包; 如果需要指定扫描路径&#xff0c;在启动程序中添加修改 ComponentScan(basePackages{"org.jstudio.a","org.jstudio.b"}) SpringBootApplication public class xxx…

平顶山市城乡建设职工培训网站花生壳官网免费域名申请

目录 一、Linux的哲学思想 1.1 基础知识 1.2 根目录下的文件夹 二、Shell 1、Shell的定义 2、Shell的作用 三、Linux命令行 1、Linux通用命令行使用格式 四、Linux命令的分类 1、内部命令和外部命令的理解 2、内部命令和外部命令的区别 3、命令的执行过程 五、编辑…

网站建设公司上海大连高端网页公司

文章目录 管道相关命令 目标 准备工作 1 cut 1.1 目标 1.2 路径 1.3 实现 2 sort 2.1 目标 2.2 路径 2.3 实现 第一步: 对字符串排序 第二步&#xff1a;去重排序 第三步: 对数值排序 默认按照字符串排序 升序 -n 倒序 -r 第四步: 对成绩排序【按照列排序】 …

婚纱定制网站哪个好如何开始做网站

redis源码剖析&#xff08;十五&#xff09;——客户端执行逻辑结构整理 加载略慢

解析网站怎么做成都网站建设招标

解决办法&#xff1a;安装laptop-mode-tools工具包。1.检查是否安装了grep laptop-mode-tools 工具包$ dpkg -l | grep laptop-mode-tools如果执行命令无结果输出&#xff0c;表示未安装(如果已安装&#xff0c;忽略第2步)2.安装laptop-mode执行命令&#xff1a;$ sudo apt-get…

怎样做网站后台iis做网站文件下载

一、源码特点 java Web火车查询管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

南昌模板建站定制个人养老金

生成的符号表达式&#xff0c;可能会存在过于冗长的问题&#xff0c;且多个符号表达式中&#xff0c;有可能存在相同的计算部分&#xff0c;如果不进行处理&#xff0c;计算过程中会导致某些算式计算多次&#xff0c;从而影响计算效率。 那么多个符号表达式生成函数时&#xf…

网站导航内链建设机加工订单网

一.Spring基础 1.Spring 框架是什么 Spring 是一款开源的轻量级 Java 开发框架&#xff0c;我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;例如&#xff0c;Spring core、Spring JDBC、Spring MVC 等&#xff0c;使用这些模块可…

递增子序列笔记

错题 leetcode 354. 俄罗斯套娃信封问题 错因和思路:1.心态:因为是自己原来做过的题目就掉以轻心了,导致情况没有考虑周全 2.思路:将宽度进行排序,高度没管,如果相同就不改变二分后找到的修改位置,显然这会少答…

MonoDETR(2)

实验结果如下:

记录---window.close()失效 + Chrome浏览器调试线上代码

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 情况说明主系统单点登录点击触发window.open()打开本系统。 是发布生产后的新需求:要求退出登录后直接关闭当前系统页面。 本地运行增加了window.close()方法实…

启发式合并 [USACO22DEC] Making Friends P

题意 \(N\) 牛 \(M\) 关系,按照编号从小到大,牛依次离开,每一头牛离开时它认识的牛会互相认识,求最后新增了多少朋友关系。 \(N,M\le 2\times 10^5\) 解法 我们将操作看成每个点边集合的合并,尝试使用启发式合并解…

ps企业站网站做多大网站建设功能覆盖范围

Truth Truth 是用于Java测试的断言框架&#xff0c;灵感来自于FEST&#xff0c;并受到一些可扩展性需求的驱动&#xff0c;几乎完全由谷歌员工在业余时间编写&#xff0c;或者作为Java核心图书馆管理员的身份做出贡献。 作用 作为工程师&#xff0c;我们花费大部分的时间来阅…

动易的网站能否静态提供o2o网站建设

#文件防泄密软件# 中科数安是一家专注于信息安全领域的高科技企业&#xff0c;其提供的防止公司内部文件资料及数据外泄的解决方案主要包括图档透明加密和源代码防泄露系统等核心服务。 中科数安 | 图档、源代码防止外泄系统 PC地址&#xff1a; www.weaem.com 1. 图档透明加…

加密的病例单

点击查看代码 #include<iostream> #include<cstring> using namespace std; char s[55]; char d[55]; int main() {gets_s(s);int len = strlen(s);s[len] = \0;d[len] = \0;for (int i = 0; i < len; …

【多线程】什么是原子操作(Atomic Operation)? - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

详细介绍:视频融合平台EasyCVR构筑智慧交通可视化管理与智能决策中枢

详细介绍:视频融合平台EasyCVR构筑智慧交通可视化管理与智能决策中枢pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

php高性能网站建设深圳微信网站开发公司

今日分享阿里云一面&#xff0c;给要准备就业的宝子们一点方向 1、自我介绍与项目介绍 2、八股文 Java的特性、Java的oop&#xff1f; Java有哪些方法来实现线程安全&#xff1f; 讲讲Spring中的AOP与IOC&#xff1f; synchronized锁怎么用&#xff1f; Mysql中右模糊查询用…

docker 在x86上build arm 镜像

好——你想在 x86 主机上构建 ARM 镜像(比如为 Raspberry Pi 或者 ARM 服务器构建 linux/arm64 / linux/arm/v7)。下面给出一套实用、可直接复制执行的步骤、常用命令、以及常见问题与优化建议,覆盖从环境准备到构建…