| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 拒绝“裸奔“,SpringBoot集成Jasypt加密敏感信息 -> 正文阅读 |
|
[Java知识库]拒绝“裸奔“,SpringBoot集成Jasypt加密敏感信息 |
文章目录前言??在互联网遍布社会各个角落的时代,伴随着的是安全问题总是层出不穷。 19年4月,根据深圳市人民检察院微信消息,深圳某知名无人机企业的工程师因为泄露公司源代码到开源社区Github上而造成了公司巨大的损失,最终被判处有期徒刑6个月,罚款20万元。 ??一般公司的核心业务代码中,都会存在与数据库、第三方通信的secret key等敏感信息,如果以明文的方式存储,一旦泄露,那将会给公司带来巨大的损失。 然而,许多中小型公司开发者对这方面的管理不够规范,所以很多敏感信息都是直接以明文形式存放到代码中,这样的项目存在的安全风险非常大。 ??本篇文章通过讲解:Springboot集成Jasypt对项目敏感信息进行加密,提高系统的安全性。 哪些信息需要加密??一个系统中,一般和数据库、第三方系统等交互的信息都会存在相应的配置文件中,在配置文件中,所有涉及到信息安全的配置项都不应该以明文的形式存储,否则,一旦配置文件泄露,则会引出巨大的安全问题,常见的需要加密的信息项如下:
敏感信息加密的作用??第一:是为了防止人为误操作将代码泄漏时,第三方能够简单获取到系统中的敏感信息,从而可能对系统、数据库等造成破坏。 ??其次是一般系统上线都会有代码安全检测的流程,像账号、密码等敏感数据以明文形式存储,一般都是审核不通过的,因此需要进行加密处理。 ??最后,作为一名开发者,应该对自我有更高的要求,在开发过程中应该要考虑到潜在的风险,提供相应的处理预案。 选择加密的组件??开源社区强大之处在于:有需求就有人奉献。Jasypt(全称:Java Simplified Encryption),它是一个Java类库,支持开发者无需深入 了解密码学相关工作原理,花费最小的代码在项目中添加基本的加密功能。 ??Jasypt官方使用文档:http://www.jasypt.org/ 项目集成Jasypt方式??jasypt-spring-boot组件则是Jasypt提供对Springboot项目集成的依赖,刚好符合我们的需求,它支持以下3种方式集成到项目中。 方式一??在Springboot应用程序中,如果使用了@SpringBootApplication or @EnableAutoConfiguration注解,则可以直接在pom文件中添加jasypt-spring-boot依赖,然后就可以在整个Spring环境中使用jasypt对属性进行加解密操作(属性包括:系统属性、环境属性、命令行参数、properties、yml以及任何其他属性源)。
方式二??如果项目中没有使用到@SpringBootApplication or @EnableAutoConfiguration注解,则可以通过以下两个步骤完成对Jasypt的集成。 ??步骤一:pom文件引入jasypt依赖
??步骤二:在配置类中,添加@EnableEncryptableProperties注解,示例如下:
??通过这种方式,你的项目一样可以集成Jasypt,并且可加密属性也可以在整个Spring环境中启用(属性包括:系统属性、环境属性、命令行参数、properties、yml以及任何其他属性源)。 方式三??如果项目中没有使用到@SpringBootApplication or @EnableAutoConfiguration注解,又不想在整个Spring环境中启用加密的属性,则可以使用该种方式,具体步骤如下: ??步骤一:pom文件引入jasypt依赖
??步骤二、在配置类中,使用@EncryptablePropertySource注解添加任意数量想要生效加密属性的配置文件路径,与Spring中@PropertySource注解的使用类似,示例如下:
??同时,还可以使用@EncryptablePropertySources 注解对@EncryptablePropertySource配置进行分组,示例如下:
??说明:从Jasypt 1.8版本开始,@EncryptablePropertySource注解支持配置YAML文件 Springboot整合Jasypt实战一、引入依赖??说明,本项目使用技术栈是spring-boot+jasypt,故使用上面介绍的第一种方式来在项目中集成Jasypt,文章中只截取部分核心代码,全部代码会开发到Github和Gitee上。
二、配置文件中添加Jasypt配置信息??1、配置jasypt参数
??2、配置加密算法秘钥 (该秘钥不能直接放在配置文件中,下面会具体总结秘钥存放的方式,从而保证安全性) 三、使用Jasypt对数据库账号和密码加密,并替换明文。??替换后的配置信息:
??Jasypt加密有3种方式,具体如下: ??方式1、使用代码生成加密串,代码工具如下:
??方式2、使用java cp命名对加密生成密文 ??参数说明:
??特别说明: 通过该种方式获取密文,需要到maven仓库下jasypt-1.9.3.jar包所在的路径下执行,否则会报找不到对应的主类。
??方式3、使用jasypt-maven插件生成密文 ??该插件是jasypt官方提供,在pom中添加对应依赖,然后使用mvn命令即可执行加解密操作,具体如下:
四、查看执行结果使用中的一些坑??使用过程中遇到了许多不可预估的问题,特意总结出来,方便读者参考。 1、使用jasypt3.0启动时报:Failed to bind properties under ‘xxx.xxx.xxx’ to java.lang.String??官方描述,3.0后默认支持的算法为PBEWITHHMACSHA512ANDAES_256 ,该种加密方式由sha512 加 AES 高级加密组成,需要JDK1.9以上支持或者添加JCE(Java Cryptography Extension无限强度权限策略文件)支持,否则运行会出现错误。 ??解决方式:
2、加解密秘钥如何存储??如果秘钥写在代码或者配置文件,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,这样对敏感信息加密的作用就不存在了,因此,秘钥不能以明文形式存储在代码或者配置文件中,下面就介绍一些安全的存储秘钥的形式。 ??方式1、把秘钥当做程序启动时的命令行参数(推荐),示例如下:
??方式2、把秘钥当做程序启动时环境变量(推荐),示例如下:
??方式3、自定义加密、解密器逻辑(这个自定代码,本文不展开讲解,后续有需要重开一篇文章详细讲解) 如何避免Git泄露??因为开发者的疏漏,不小心将源码提交到开源仓库中的新闻不在少数,作为一个开发团队,如何采取一些有效的措施去最小程度防止出现这种情况呢? 除了本文介绍的对敏感信息加密,并合理保存秘钥外,还有以下的一些方式可以参考。 ??方式1、更规范的代码提交、推送制度、培养开发者的安全意识: 很多时候,代码的泄露除了故意为之外,大多数是因为不小心导致,因此在项目中可以通过合理管控权限的方式来防止代码泄露。 ??方式2、合理利用Git忽略文件(.gitignore): 通过gitignore文件配置匹配规则,最大程度避免敏感信息上传到Git仓库。 ??方式3、借助第三方工具,在提交、推送时检测代码是否有敏感数据: 常见的如git-secrets,在提交前会对变更内容做检测,如果检测到预期的提交内容可能包含敏感信息,那它们将会拒绝提交。 ??方式4、代码的Code Review: 团队leader和成员之间可以互相合作,在代码推送合并时检测是否存在敏感数据,这样不仅可以排查出敏感数据,还能够学习彼此之间的一些编码技巧。 问题探讨??在编写本篇文章内容时,无意中看到一个消息:Nginx之父被俄罗斯警方带走,起因是因为其老东家 Rambler举报Nginx是他在就职期间的业务时间进行开发的一个软件,Rambler认为其应该有该软件代码的所有权。 ??针对这一事件大家有什么看法呢?程序员在就职期间的业务时间开发或者编写的项目应该归属于公司?欢迎在文章下留言讨论。 写在最后??源代码安全在技术企业中意味着竞争力、生命线,一旦泄露,轻则造成项目失败,重则可能导致公司倒闭,这一关检测的重要性不言而喻,作为一名开发者,也应该时刻培养自己的安全意识,在编码时规避掉相应的风险。 ??如果文章对你有帮助,欢迎给我点赞、关注。如有疑问,欢迎添加博主进行交流。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 20:31:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |